Comprender el tipo de datos ENUM en MySQL: Guía completa con ejemplos

1. Visión general del tipo ENUM

¿Qué es el tipo ENUM?

El tipo ENUM (enumeración) en MySQL es un tipo de dato que almacena exactamente un valor de una lista predefinida. Como solo se pueden guardar cadenas específicas definidas previamente en la columna, garantiza la consistencia de los datos y evita que se inserten valores no válidos.

Por ejemplo, cuando un usuario elige una opción entre un conjunto limitado como género o categoría de producto, usar el tipo ENUM elimina la necesidad de lógica de verificación de errores innecesaria. A continuación se muestra un ejemplo de creación de una tabla que contiene una columna ENUM:

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

En este ejemplo, la columna category solo puede almacenar uno de los siguientes valores: “食品”, “衣料品”, “家電” o “家具”. Esto ayuda a simplificar la gestión de datos y reduce el riesgo de entradas incorrectas.

Principales casos de uso de ENUM

El tipo ENUM se utiliza habitualmente en escenarios como:

  • Gestión de estados: Seguimiento de etapas de flujo de trabajo como “未開始”, “進行中” o “完了”.
  • Definición de categorías: Administración de opciones predefinidas como categorías de productos, tipos de usuario o puestos de trabajo.
  • Agrupación por rangos o niveles: Niveles de dificultad en juegos (“初級”, “中級”, “上級”) o calificaciones de productos (“良い”, “普通”, “悪い”).

2. Ventajas y desventajas de ENUM

Ventajas

  1. Mejora de la consistencia de los datos
    ENUM permite solo los valores incluidos en su lista predefinida, lo que posibilita un manejo consistente de la información. Por ejemplo, al gestionar el género, solo se permiten valores definidos como “男性” o “女性”, evitando entradas no válidas.
  2. Uso eficiente del almacenamiento
    Cada valor ENUM se almacena internamente como un índice entero. Como resultado, ocupa menos espacio que un VARCHAR. Por ejemplo, valores como ‘small’ o ‘large’ consumen más espacio como VARCHAR, pero ENUM los guarda de forma eficiente mediante índices numéricos.

Desventajas

  1. Falta de flexibilidad
    Los valores ENUM son fijos. Añadir nuevas opciones requiere modificar la estructura de la tabla, lo que hace que ENUM no sea adecuado para conjuntos de datos que cambian con frecuencia.
  2. Manejo de errores complejo
    Si se inserta un valor no válido, MySQL puede generar un error o almacenar una cadena vacía. Esto puede complicar la depuración para los desarrolladores.

3. Configuración de ENUM y uso práctico

Configuración básica y manejo de errores

Para configurar un tipo ENUM, basta con definir la lista de cadenas válidas. El siguiente ejemplo define una columna ENUM en una tabla:

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

Aquí, la columna size solo acepta “XS”, “S”, “M”, “L” o “XL”. Intentar insertar un valor que no esté en la lista (p. ej., ‘XXL’) produce un error Data truncated. Esto evita datos no válidos y mantiene la consistencia.

Ejemplo de uso práctico

El siguiente ejemplo utiliza ENUM para gestionar roles de usuario como “管理者”, “一般ユーザー” y “ゲスト”:

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

Usar una columna ENUM facilita mantener permisos consistentes y control basado en roles.

4. Indexación y manejo de NULL con ENUM

Uso de índices

Los valores ENUM reciben índices enteros según su posición en la lista. Por ejemplo:

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

“S” tiene el índice 1, “M” el índice 2, y así sucesivamente. Estos índices pueden emplearse en cláusulas WHERE:

SELECT * FROM products WHERE size = 2;

Esta consulta recupera los registros donde el tamaño corresponde a “M”.

Manejo de NULL y cadenas vacías

Si se permite NULL, la columna puede almacenar NULL como un estado válido aunque no esté en la lista ENUM. Además, los datos no válidos insertados como cadena vacía se guardan con el índice 0, lo que facilita la detección de entradas incorrectas.

5. Conjuntos de caracteres y intercalaciones para ENUM

Cómo establecer conjuntos de caracteres e intercalaciones

ENUM, al igual que CHAR o VARCHAR, admite definiciones de juego de caracteres y colación. Esto es importante al manejar datos multilingües o operaciones de ordenación. Ejemplo:

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

Este ejemplo especifica UTF-8 y una colación de propósito general.

6. Extensión de ENUM y Alternativas

Técnicas para Ampliar ENUM

Dado que ENUM carece de flexibilidad para valores dinámicos, puedes incluir una opción “Otro” y almacenar la entrada libre en una columna separada:

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

Esto permite guardar valores que no están incluidos en la lista de ENUM mientras se mantiene la estructura.

Tipos de Datos Alternativos: SET o VARCHAR

Según los requisitos, las alternativas incluyen:

  • Tipo SET : Almacena múltiples selecciones de una lista.
  • VARCHAR : Ofrece la máxima flexibilidad sin restricciones predefinidas.