Directorio de artículos
Dirección del documento oficial: 11.3.5 El tipo ENUM
Una enumeración es un objeto de cadena cuyo valor se selecciona de una lista de valores permitidos. Estos valores se enumeran explícitamente en la especificación de la columna cuando se crea la tabla.
Consulte 11.3.1 Sintaxis de tipo de datos de cadena para conocer la ENUM
sintaxis de tipo y la limitación de longitud.
ENUM
El tipo tiene las siguientes ventajas:
- Comprima el almacenamiento de datos cuando el conjunto de valores posibles para una columna es limitado. La cadena especificada como valor de entrada se codificará automáticamente como un número.
ENUM
Para conocer los requisitos de almacenamiento de los tipos, consulte 11.7 Requisitos de almacenamiento de tipos de datos . - Consulta y salida legibles. Estos números se vuelven a convertir a la cadena correspondiente en los resultados de la consulta.
Es necesario considerar estos problemas potenciales:
- Si hace que los valores de enumeración parezcan números, como se explica en las restricciones de enumeración, es fácil confundir los valores de texto y sus números de índice internos.
- El
ORDER BY
uso deENUM
columnas en cláusulas requiere un cuidado especial, como se explica en Clasificación de enumeraciones.
Crear y usar columnas ENUM
El valor de enumeración debe ser un literal de cadena entre comillas. Por ejemplo, puede crear una ENUM
tabla con columnas como esta :
CREATE TABLE shirts (
name VARCHAR(40),
size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);
INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'), ('polo shirt','small');
SELECT name, size FROM shirts WHERE size = 'medium';
+---------+--------+
| name | size |
+---------+--------+
| t-shirt | medium |
+---------+--------+
UPDATE shirts SET size = 'small' WHERE size = 'large';
COMMIT;
Los datos de 100
valor de un millón de líneas 'medium'
en la tabla requieren 100
un millón de bytes de espacio de memoria, y si la cadena real 'medium'
en la VARCHAR
columna de almacenamiento se requiere 600
un millón de bytes.
Valor de índice del literal de enumeración
Cada valor de enumeración tiene un índice:
- A los elementos enumerados en la especificación de la columna se les asignan números de índice, comenzando desde el
1
principio. - El valor de índice del valor de error de cadena vacía es
0
. Esto significa que puede usar la siguienteSELECT
declaración para buscarENUM
filas que especifiquen valores no válidos :
mysql> SELECT * FROM tbl_name WHERE enum_col=0;
NULL
El índice del valor esNULL
.- El término "índice" aquí se refiere a una posición en la lista de valores enumerados. No tiene nada que ver con el índice de la tabla.
Por ejemplo, ENUM('Mercury', 'Venus', 'Earth')
la columna designada como puede tener cualquiera de los valores que se muestran en la siguiente tabla. La siguiente tabla también muestra el índice de cada valor.
valor | índice |
---|---|
NULL |
NULL |
'' |
0 |
'Mercury' |
1 |
'Venus' |
2 |
'Earth' |
3 |
Una ENUM
columna puede tener como máximo 65,535
un elemento diferente.
Si el valor se recupera en un contexto numérico, ENUM
se devuelve el índice del valor de la columna. Por ejemplo, puede ENUM
recuperar valores de una columna como esta :
mysql> SELECT enum_col+0 FROM tbl_name;
Funciones que requieren parámetros numéricos tales como SUM()
o AVG()
convierten los parámetros a los números cuando sea necesario. Para el ENUM
valor, el número de índice se utiliza en el cálculo.
Manejo de literales enumerados
Al crear una tabla, los espacios finales se eliminan automáticamente de los ENUM
valores de los miembros en la definición de la tabla .
Al recuperar, ENUM
los valores almacenados en la columna se mostrarán utilizando las letras utilizadas en la definición de la columna. Tenga en cuenta que a la columna ENUM se le puede asignar un conjunto de caracteres y una colación. Para las intercalaciones binarias o que distinguen entre mayúsculas y minúsculas, se deben considerar las letras al asignar valores a las columnas.
Si almacena un número en una ENUM
columna, el número se tratará como un índice de valores posibles y el valor almacenado es el miembro de enumeración con ese índice. (Sin embargo, esto LOAD DATA
no funciona, LOAD DATA
todas las entradas se tratan como cadenas). Si se hace referencia al valor, si una lista enumerada de valores no coincide con la cadena, queda por interpretar como un índice. Por estas razones, no se recomienda definir una columna de enumeración cuyos valores de enumeración parezcan números, ya que esto puede causar confusión fácilmente. Por ejemplo, los valores de cadena de los siguientes miembros de enumeración son '0'
, '1'
y '2'
, pero el valor del índice numérico es 1
, 2
y 3
:
numbers ENUM('0','1','2')
Si se almacena 2
, se interpretará como el valor del índice y se convertirá en '1'
( 2
el valor del índice ). Si se almacena '2'
, coincidirá con un valor enumerado, así que guárdelo como '2'
. Si se almacena '3'
, no coincide con ningún valor enumerado, por lo que se trata como un índice y se convierte en '2'
( 3
valor del índice ).
mysql> INSERT INTO t (numbers) VALUES(2),('2'),('3');
mysql> SELECT * FROM t;
+---------+
| numbers |
+---------+
| 1 |
| 2 |
| 2 |
+---------+
Para determinar ENUM
todos los valores posibles de SHOW COLUMNS FROM tbl_name LIKE 'enum_col'
una Type
columna , use ENUM
la definición que se puede ver en la columna de salida .
mysql> SHOW COLUMNS FROM shirts LIKE 'size';
+-------+----------------------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------------------------------------+------+-----+---------+-------+
| size | enum('x-small','small','medium','large','x-large') | YES | | NULL | |
+-------+----------------------------------------------------+------+-----+---------+-------+
1 row in set
mysql>
Valor de enumeración vacío o NULO
Los valores de enumeración también pueden ser cadenas vacías ( ''
) o NULL
:
- Si inserta un valor no válido en
ENUM
(es decir, una cadena que no aparece en la lista de valores permitidos), la cadena vacía se insertará como un valor de error especial, que es el mismo que la cadena vacía "normal" La diferencia se encuentra en el valor de índice de esta cadena0
. Para obtener más información sobre el índice numérico de los valores de enumeración, consulte Valor de índice de los literales de enumeración.
Si el modo SQL estricto está habilitado, los intentos de insertarENUM
valores no válidos provocarán un error. - Si la
ENUM
columna se declara como permitidaNULL
, elNULL
valor es un valor válido para la columna y el valor predeterminado esNULL
. Si unaENUM
columna se declara como negativaNULL
, su valor predeterminado es el primer elemento de la lista de valores permitidos.
Orden de enumeración
ENUM
Los valores se ordenan por número de índice, que depende del orden en el que se enumeran los miembros de la enumeración en la especificación de la columna. Por ejemplo, ENUM('b','a')
, 'b'
la 'a'
clase antes. Las cadenas vacías se ordenan antes que las cadenas no vacías y los NULL
valores se ordenan antes que todos los demás valores enumerados.
Para evitar resultados inesperados al ENUM
utilizar ORDER BY
cláusulas en columnas , puede utilizar una de las siguientes técnicas:
- Especifique la
ENUM
lista en orden alfabético . - Asegúrese de que las columnas estén ordenadas léxicamente, no por número de índice. Eso es
ORDER BY CAST(col AS CHAR)
oORDER BY CONCAT(col)
.
Límite de enumeración
El valor de enumeración no puede ser una expresión, incluso si el resultado del cálculo de la expresión es un valor de cadena.
Por ejemplo, la siguiente CREATE TABLE
declaración no funcionará porque las CONCAT
funciones no se pueden usar para construir valores de enumeración:
CREATE TABLE sizes (
size ENUM('small', CONCAT('med','ium'), 'large')
);
Tampoco puede utilizar variables de usuario como valores de enumeración. Esto no tiene ningún efecto en la declaración:
SET @mysize = 'medium';
CREATE TABLE sizes (
size ENUM('small', @mysize, 'large')
);
Recomendamos encarecidamente que no utilice números como valores de enumeración, porque no ahorra espacio de almacenamiento en comparación con el tipo TINYINT
o el SMALLINT
tipo apropiado , y es fácil confundir la cadena y el valor numérico subyacente (o tal vez no) si no cite correctamente la enumeración. Si utiliza un número como valor de enumeración, escríbalo siempre entre comillas. Si se omiten las comillas, el número se tratará como un índice. Consulte el manejo de literales enumerados para comprender que incluso los números entre comillas pueden usarse incorrectamente como valores de índice numérico.
Si se habilita el modo SQL estricto, los valores duplicados en la definición causarán advertencias o errores.