Comprendre le type de données ENUM dans MySQL : guide complet avec exemples

1. Vue d’ensemble du type ENUM

Qu’est-ce que le type ENUM ?

Le type ENUM (énumération) dans MySQL est un type de données qui stocke exactement une valeur parmi une liste prédéfinie. Comme seules des chaînes spécifiques prédéfinies peuvent être enregistrées dans la colonne, il garantit la cohérence des données et empêche l’insertion de valeurs invalides.

Par exemple, lorsqu’un utilisateur choisit une option parmi des choix limités tels que le genre ou la catégorie de produit, l’utilisation du type ENUM élimine la logique de vérification d’erreurs superflue. L’exemple suivant montre la création d’une table contenant une colonne ENUM :

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

Dans cet exemple, la colonne category ne peut contenir qu’une des valeurs suivantes : “食品”, “衣料品”, “家電” ou “家具”. Cela simplifie la gestion des données et réduit le risque d’entrées incorrectes.

Principaux cas d’utilisation de ENUM

  • Gestion des statuts : suivi des étapes du flux de travail comme “未開始”, “進行中”, ou “完了”.
  • Définition de catégories : gestion des options prédéfinies comme les catégories de produits, les types d’utilisateurs ou les postes.
  • Classement ou regroupement de niveaux : niveaux de difficulté de jeu (“初級”, “中級”, “上級”) ou évaluations de produits (“良い”, “普通”, “悪い”).

2. Avantages et inconvénients du ENUM

Avantages

  1. Amélioration de la cohérence des données : ENUM n’accepte que les valeurs incluses dans sa liste prédéfinie, ce qui permet un traitement cohérent des données. Par exemple, lors de la gestion du genre, seules les valeurs définies telles que “男性” ou “女性” sont autorisées, évitant ainsi les entrées invalides.
  2. Utilisation efficace du stockage : chaque valeur ENUM est stockée en interne sous forme d’indice entier. En conséquence, elle consomme moins d’espace que VARCHAR. Par exemple, les valeurs « small » ou « large » occupent plus d’espace en VARCHAR, alors qu’ENUM les stocke efficacement grâce à des indices numériques.

Inconvénients

  1. Manque de flexibilité : les valeurs ENUM sont fixes. Ajouter de nouvelles options nécessite de modifier la structure de la table, ce qui rend ENUM inadapté aux ensembles de données qui changent fréquemment.
  2. Gestion d’erreurs complexe : si une valeur invalide est insérée, MySQL peut générer une erreur ou stocker une chaîne vide. Cela peut compliquer le débogage pour les développeurs.

3. Configuration du ENUM et utilisation pratique

Configuration de base et gestion des erreurs

Pour configurer un type ENUM, il suffit de définir la liste des chaînes valides. L’exemple suivant définit une colonne ENUM dans une table :

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

Ici, la colonne size n’accepte que “XS”, “S”, “M”, “L” ou “XL”. Tenter d’insérer une valeur qui ne figure pas dans la liste (par ex., « XXL ») entraîne une erreur Data truncated. Cela empêche les données invalides et maintient la cohérence.

Exemple d’utilisation pratique

L’exemple suivant utilise ENUM pour gérer les rôles d’utilisateurs tels que “管理者”, “一般ユーザー” et “ゲスト” :

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

L’utilisation d’une colonne ENUM facilite le maintien de permissions cohérentes et le contrôle basé sur les rôles.

4. Indexation et gestion du NULL avec ENUM

Utilisation des index

Les valeurs ENUM se voient attribuer des indices entiers en fonction de leur position dans la liste. Par exemple :

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

“S” a l’indice 1, “M” l’indice 2, etc. Ces indices peuvent être utilisés dans les clauses WHERE :

SELECT * FROM products WHERE size = 2;

Cette requête récupère les enregistrements où la taille correspond à “M”.

Gestion du NULL et des chaînes vides

Si NULL est autorisé, la colonne peut stocker NULL comme état valide même s’il ne figure pas dans la liste ENUM. De plus, les données invalides insérées sous forme de chaîne vide sont stockées avec l’indice 0, ce qui rend les entrées incorrectes faciles à détecter.

5. Jeux de caractères et interclassements pour ENUM

Comment définir les jeux de caractères et les interclassements

ENUM, comme CHAR ou VARCHAR, prend en charge les définitions de jeu de caractères et de collation. C’est important lors du traitement de données multilingues ou d’opérations de tri. Exemple :

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

Cet exemple spécifie UTF-8 et une collation à usage général.

6. Extension d’ENUM et alternatives

Techniques pour étendre ENUM

Comme ENUM manque de flexibilité pour des valeurs dynamiques, vous pouvez inclure une option « Autre » et stocker la saisie libre dans une colonne séparée :

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

Cela permet de stocker des valeurs non présentes dans la liste ENUM tout en conservant la structure.

Types de données alternatifs : SET ou VARCHAR

Selon les besoins, les alternatives comprennent :

  • type SET : Stocke plusieurs sélections à partir d’une liste.
  • VARCHAR : Offre une flexibilité maximale sans contraintes prédéfinies.