Guía completa de ENUM en MySQL: uso, ventajas y precauciones

1. Resumen del tipo ENUM

Qué es el tipo ENUM

El tipo ENUM de MySQL (enumeración) es un tipo de datos que almacena un solo valor seleccionado de una lista predefinida. Como solo se pueden guardar en la columna las cadenas específicas especificadas en la lista, permite mantener la consistencia de los datos y evita la inserción de datos no válidos. Por ejemplo, cuando un usuario debe elegir entre opciones limitadas como género o categoría de producto, usar el tipo ENUM permite omitir comprobaciones de error innecesarias. A continuación se muestra un ejemplo de creación de una tabla que incluye una columna ENUM:
CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    category ENUM('Alimentos', 'Ropa', 'Electrodomésticos', 'Muebles') NOT NULL
);
En este ejemplo, la columna «category» puede almacenar solo uno de los cuatro valores «Alimentos», «Ropa», «Electrodomésticos» o «Muebles». Esto simplifica la gestión de los datos y reduce el riesgo de errores de entrada.

Principales usos del tipo ENUM

El tipo ENUM se utiliza principalmente en los siguientes casos:
  • Gestión de estados: para gestionar el progreso de un proyecto, se enumeran estados como «No iniciado», «En progreso», «Completado».
  • Clasificación por categorías: se usa al gestionar opciones de categorías predefinidas como productos, tipos de usuario, cargos, etc.
  • Clasificación por rangos: por ejemplo, la dificultad de un juego («Principiante», «Intermedio», «Avanzado») o la valoración de un producto («Bueno», «Regular», «Malo»).

2. Ventajas y desventajas del tipo ENUM

Ventajas

  1. Mejora de la integridad de los datos En el tipo ENUM solo se pueden almacenar los valores que están en la lista especificada, lo que garantiza la consistencia de los datos y facilita su gestión. Por ejemplo, al gestionar el género, solo se permiten valores específicos como “masculino” o “femenino”, evitando entradas incorrectas.
  2. Eficiencia del almacenamiento En el tipo ENUM a cada valor de la lista se le asigna un índice entero, por lo que se almacena como un entero, lo que ahorra espacio de almacenamiento en comparación con el tipo VARCHAR. Por ejemplo, guardar información de tamaño como ‘small’ o ‘large’ en VARCHAR consume más espacio, mientras que definirlo como ENUM permite un almacenamiento más eficiente.

Desventajas

  1. de flexibilidad El tipo ENUM solo permite opciones fijas, por lo que agregar nuevos valores requiere modificar la estructura de la tabla. Por ello, no es adecuado para casos en los que las opciones debenicamente.
  2. Dificultad en el manejo de errores Si se inserta un valor no válido, se producirá un error o se almacenará una cadena vacía, lo que puede complicar la depuración para los desarrolladores.

3. Configuración y ejemplos de uso del tipo ENUM

Configuración básica y manejo de errores

La configuración del tipo ENUM consiste simplemente en especificar las cadenas que pueden almacenarse en la lista. A continuación se muestra un ejemplo de definición de una columna de tipo ENUM en una tabla:
CREATE TABLE shirts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    size ENUM('XS', 'S', 'M',L', 'XL') NOT NULL
);
En este caso, la columna «size» solo puede almacenar uno de los 5 valores «XS», «S», «M», «L» o «XL». Si se intenta insertar un valor que no está en la lista (por ejemplo, ’XXL’), se producirá un error Data truncated. Esto evita el almacenamiento de valores no incluidos en la lista y ayuda a mantener la consistencia de los datos。

Ejemplo práctico

A continuación se muestra un ejemplo de uso del tipo ENUM para gestionar los roles de los usuarios («Administrador», «Usuario estándar», «Invitado»)。
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    role ENUM('Administrador', 'Usuario estándar', 'Invitado') NOT NULL
);
Si se desea asignar diferentes permisos según el rol, usar una columna de tipo ENUM facilita mantener la integridad de los datos。

4. Índice del tipo ENUM y manejo de NULL

Uso del índice

Los valores del tipo ENUM reciben un índice a partir de 1 siguiendo el orden de la lista. Por ejemplo, si existe una columna ENUM que almacena información de tallas como la siguiente:
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. Este índice también puede usarse en condiciones de la cláusula WHERE, lo que permite operaciones de datos eficientes.
SELECT * FROM products WHERE size = 2;
Esta consulta obtiene los registros cuya talla es «M».

Manejo de NULL y cadena vacía

Permitir NULL en una columna de tipo ENUM permite almacenar valores NULL incluso cuando no están en la lista. Además, si se inserta una cadena vacía como dato erróneo, se almacena con el índice 0, lo que permite identificar entradas incorrectas.

5. Conjunto de caracteres y orden de colación del tipo ENUM

Método para establecer el conjunto de caracteres y el orden de colación

El tipo ENUM, al igual que CHAR y VARCHAR, permite especificar el conjunto de caracteres y la colación. Es especialmente importante para el soporte multilingüe y para realizar búsquedas que tengan en cuenta la colación. A continuación se muestra un ejemplo:
CREATE TABLE documents (
    id INT AUTO_INCREMENT PRIMARY KEY,
    language ENUM('japonés', 'inglés', 'chino') CHARACTER SET utf8 COLLATE utf8_general_ci
);
En este ejemplo, se especifican el conjunto de caracteres UTF-8 y una colación general.

6. Extensibilidad del tipo ENUM y alternativas

Estrategias de ampliación

El tipo ENUM carece de flexibilidad para almacenar valores libres en una columna, por lo que no es adecuado para datos que cambian dinámicamente. En este caso, se puede agregar una opción «Otros» y crear una columna de entrada libre por separado:
ALTER TABLE products 
MODIFY COLUMN category ENUM('食品', '衣料品', '家電', '家具', 'その他') NOT NULL,
ADD COLUMN category_other VARCHAR(255) DEFAULT NULL;
De esta manera, los elementos que no están en el tipo ENUM se almacenan en otra columna VARCHAR, permitiendo una adaptación dinámica.

Tipos de datos alternativos como SET y VARCHAR

Como alternativa al tipo ENUM, considerar el tipo SET, que permite almacenar múltiples opciones, o el más flexible tipo VARCHAR, también es una opción.