Comprendere il tipo di dato ENUM in MySQL: Guida completa con esempi

1. Panoramica del tipo ENUM

Che cos’è il tipo ENUM?

Il tipo ENUM (enumerazione) in MySQL è un tipo di dato che memorizza esattamente un valore da un elenco predefinito. Poiché solo stringhe specifiche predefinite possono essere salvate nella colonna, garantisce la coerenza dei dati e impedisce l’inserimento di valori non validi.

Ad esempio, quando un utente sceglie un’opzione da scelte limitate come genere o categoria di prodotto, l’utilizzo del tipo ENUM elimina la necessità di logiche di controllo errori superflue. Di seguito è riportato un esempio di creazione di una tabella contenente una colonna ENUM:

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    category ENUM('食品', '衣料品', '家電', '家具') NOT NULL
);

In questo esempio, la colonna category può contenere solo uno dei seguenti valori: “食品”, “衣料品”, “家電” o “家具”. Questo semplifica la gestione dei dati e riduce il rischio di inserimenti errati.

Principali casi d’uso di ENUM

Il tipo ENUM è comunemente impiegato in scenari quali:

  • Gestione dello stato: monitorare le fasi di un flusso di lavoro come “未開始”, “進行中” o “完了”.
  • Definizione di categorie: gestire opzioni predefinite come categorie di prodotto, tipi di utente o posizioni lavorative.
  • Raggruppamento per ranking o livello: livelli di difficoltà di un gioco (“初級”, “中級”, “上級”) o valutazioni di prodotto (“良い”, “普通”, “悪い”).

2. Vantaggi e svantaggi di ENUM

Vantaggi

  1. Migliore coerenza dei dati – ENUM consente solo valori inclusi nel suo elenco predefinito, garantendo una gestione coerente dei dati. Ad esempio, nella gestione del genere, sono permessi solo valori definiti come “男性” o “女性”, evitando input non validi.
  2. Utilizzo efficiente dello spazio – Ogni valore ENUM è memorizzato internamente come indice numerico. Di conseguenza, occupa meno spazio rispetto a VARCHAR. Per esempio, valori come ‘small’ o ‘large’ richiederebbero più spazio come VARCHAR, mentre ENUM li archivia in modo compatto tramite indici numerici.

Svantaggi

  1. Mancanza di flessibilità – I valori ENUM sono fissi. L’aggiunta di nuove opzioni richiede la modifica della struttura della tabella, rendendo ENUM inadatto a dataset che cambiano frequentemente.
  2. Gestione complessa degli errori – Se viene inserito un valore non valido, MySQL può generare un errore o memorizzare una stringa vuota. Questo può complicare il debug per gli sviluppatori.

3. Configurazione di ENUM e utilizzo pratico

Configurazione di base e gestione degli errori

Per configurare un tipo ENUM, basta definire l’elenco di stringhe valide. L’esempio seguente definisce una colonna ENUM in una tabella:

CREATE TABLE shirts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    size ENUM('XS', 'S', 'M', 'L', 'XL') NOT NULL
);

Qui, la colonna size accetta solo “XS”, “S”, “M”, “L” o “XL”. Tentare di inserire un valore non presente nell’elenco (ad esempio ‘XXL’) genera un errore Data truncated. Questo impedisce dati non validi e mantiene la coerenza.

Esempio di utilizzo pratico

L’esempio seguente utilizza ENUM per gestire ruoli utente come “管理者”, “一般ユーザー” e “ゲスト”:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    role ENUM('管理者', '一般ユーザー', 'ゲスト') NOT NULL
);

L’uso di una colonna ENUM semplifica il mantenimento di permessi coerenti e il controllo basato sui ruoli.

4. Indicizzazione e gestione di NULL con ENUM

Utilizzo degli indici

I valori ENUM ricevono indici interi in base alla loro posizione nell’elenco. Per esempio:

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    size ENUM('S', 'M', 'L', 'XL')
);

“S” ha indice 1, “M” indice 2 e così via. Questi indici possono essere usati nelle clausole WHERE:

SELECT * FROM products WHERE size = 2;

Questa query recupera i record in cui la dimensione corrisponde a “M”.

Gestione di NULL e stringhe vuote

Se è consentito NULL, la colonna può memorizzare NULL come stato valido anche se non presente nell’elenco ENUM. Inoltre, dati non validi inseriti come stringa vuota vengono memorizzati con indice 0, rendendo facile individuare input errati.

5. Set di caratteri e collazioni per ENUM

Come impostare set di caratteri e collazioni

ENUM, come CHAR o VARCHAR, supporta definizioni di set di caratteri e collazione. Questo è importante quando si gestiscono dati multilingue o operazioni di ordinamento. Esempio:

CREATE TABLE documents (
    id INT AUTO_INCREMENT PRIMARY KEY,
    language ENUM('日本語', '英語', '中国語') 
        CHARACTER SET utf8 
        COLLATE utf8_general_ci
);

Questo esempio specifica UTF-8 e una collazione di uso generale.

6. Estendere ENUM e Alternative

Tecniche per Espandere ENUM

Poiché ENUM manca di flessibilità per valori dinamici, è possibile includere un’opzione “Altro” e memorizzare l’input libero in una colonna separata:

ALTER TABLE products 
MODIFY COLUMN category ENUM('食品', '衣料品', '家電', '家具', 'その他') NOT NULL,
ADD COLUMN category_other VARCHAR(255) DEFAULT NULL;

Ciò consente di memorizzare valori non inclusi nella lista ENUM mantenendo la struttura.

Tipi di Dati Alternativi: SET o VARCHAR

A seconda dei requisiti, le alternative includono:

  • Tipo SET : Memorizza più selezioni da un elenco.
  • VARCHAR : Offre la massima flessibilità senza vincoli predefiniti.