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
- 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.
- 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
- 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.
- 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.

