1. Panoramica del tipo di dati ENUM
Che cos’è il tipo di dati ENUM?
Il tipo di dati MySQL ENUM (enumerazione) memorizza esattamente un valore da un elenco predefinito. Poiché solo le stringhe specifiche definite nell’elenco possono essere salvate nella colonna, aiuta a mantenere la coerenza dei dati e previene inserimenti non validi.
Ad esempio, quando gli utenti devono scegliere un’opzione da un insieme limitato come genere o categoria di prodotto, l’uso di ENUM elimina la necessità di controlli di validazione superflui. Di seguito è riportato un esempio di creazione di una tabella che include una colonna ENUM:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
category ENUM('Food', 'Clothing', 'Electronics', 'Furniture') NOT NULL
);
In questo esempio, la colonna “category” può contenere solo uno dei seguenti quattro valori: “Food”, “Clothing”, “Electronics” o “Furniture”. Ciò semplifica la gestione dei dati e riduce il rischio di inserimenti errati.
Principali casi d’uso di ENUM
Il tipo di dati ENUM è utilizzato principalmente nei seguenti scenari:
- Gestione dello stato : Enumerazione degli stati di avanzamento del progetto come “Not Started”, “In Progress” e “Completed”.
- Categorizzazione : Gestione di opzioni di categoria predefinite come prodotti, tipi di utente o ruoli lavorativi.
- Classifica : Livelli di difficoltà del gioco (“Beginner”, “Intermediate”, “Advanced”) o valutazioni dei prodotti (“Good”, “Average”, “Poor”).
2. Vantaggi e svantaggi di ENUM
Vantaggi
- Integrità dei dati migliorata Con ENUM, solo i valori inclusi nell’elenco predefinito possono essere memorizzati, garantendo la coerenza dei dati e semplificando la gestione. Ad esempio, nella gestione del genere, sono consentiti solo valori specifici come “Male” o “Female”, evitando inserimenti errati.
- Efficienza di archiviazione Ogni valore ENUM è internamente assegnato a un indice intero, il che significa che i valori sono memorizzati come interi. Rispetto a VARCHAR, ciò riduce l’uso di spazio. Ad esempio, memorizzare informazioni di dimensione come ‘small’ o ‘large’ usando VARCHAR consuma più spazio, mentre definirle con ENUM permette una memorizzazione più efficiente.
Svantaggi
- Mancanza di flessibilità Poiché ENUM consente solo valori predefiniti, l’aggiunta di nuovi valori richiede la modifica della struttura della tabella. Pertanto, non è adatto a scenari in cui le opzioni cambiano frequentemente in modo dinamico.
- Gestione complessa degli errori Se viene inserito un valore non valido, può verificarsi un errore o può essere memorizzata una stringa vuota. Questo comportamento può complicare il debug per gli sviluppatori.
3. Configurazione ed esempi d’uso di ENUM
Configurazione di base e gestione degli errori
Impostare un tipo di dati ENUM è semplicemente una questione di specificare l’elenco di stringhe consentite. Di seguito è riportato un esempio di definizione di una colonna ENUM in una tabella:
CREATE TABLE shirts (
id INT AUTO_INCREMENT PRIMARY KEY,
size ENUM('XS', 'S', 'M', 'L', 'XL') NOT NULL
);
In questo caso, la colonna “size” può contenere solo uno dei cinque valori: “XS”, “S”, “M”, “L” o “XL”. Se si tenta di inserire un valore non presente nell’elenco (ad esempio, ‘XXL’), si verificherà un errore Data truncated. Questo impedisce che valori al di fuori dell’elenco predefinito vengano memorizzati e aiuta a mantenere la coerenza dei dati.
Esempio pratico
Di seguito è riportato un esempio di utilizzo di ENUM per gestire i ruoli degli utenti (“Administrator”, “Regular User”, “Guest”):
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
role ENUM('Administrator', 'Regular User', 'Guest') NOT NULL
);
Quando si assegnano permessi diversi in base ai ruoli, l’uso di una colonna ENUM semplifica il mantenimento dell’integrità dei dati. 
4. Indici ENUM e gestione di NULL
Utilizzo dei valori di indice
Ogni valore ENUM è assegnato a un indice numerico a partire da 1 in base alla sua posizione nell’elenco. Ad esempio, consideriamo la seguente colonna ENUM che memorizza informazioni di dimensione:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
size ENUM('S', 'M', 'L', 'XL')
);
“S” è assegnato all’indice 1, “M” all’indice 2 e così via. Questi valori di indice possono anche essere usati nelle condizioni WHERE per operazioni sui dati più efficienti.
SELECT * FROM products WHERE size = 2;
Questa query recupera i record in cui la dimensione è “M”.
Gestione di NULL e stringhe vuote
Se NULL è consentito in una colonna ENUM, i valori NULL possono essere memorizzati anche se non fanno parte dell’elenco predefinito. Inoltre, se vengono inseriti dati non validi e convertiti in una stringa vuota, vengono memorizzati con indice 0. Questo comportamento rende possibile rilevare input errati.
5. Set di caratteri e collazioni in ENUM
Come configurare set di caratteri e collazioni
Come per CHAR e VARCHAR, il tipo di dato ENUM consente di specificare un set di caratteri e una collazione. Questo è particolarmente importante quando si costruiscono sistemi multilingue o si eseguono ricerche che dipendono dalle regole di collazione. Di seguito è riportato un esempio:
CREATE TABLE documents (
id INT AUTO_INCREMENT PRIMARY KEY,
language ENUM('Japanese', 'English', 'Chinese') CHARACTER SET utf8 COLLATE utf8_general_ci
);
In questo esempio vengono specificati il set di caratteri UTF‑8 e una collazione generale.
6. Estendibilità e alternative a ENUM
Strategie per estendere ENUM
Poiché ENUM manca di flessibilità per la memorizzazione di valori arbitrari, non è adatto a dati che cambiano dinamicamente. Un approccio consiste nell’aggiungere un’opzione “Altro” e fornire una colonna di testo libero separata:
ALTER TABLE products
MODIFY COLUMN category ENUM('Food', 'Clothing', 'Electronics', 'Furniture', 'Other') NOT NULL,
ADD COLUMN category_other VARCHAR(255) DEFAULT NULL;
In questo modo, i valori non inclusi nell’elenco ENUM possono essere memorizzati in una colonna VARCHAR separata, consentendo una gestione dinamica quando necessario.
Uso di SET o VARCHAR come alternative
Come alternative a ENUM, si può considerare il tipo di dato SET (che consente selezioni multiple) o il più flessibile tipo VARCHAR, a seconda dei requisiti della propria applicazione.


