11.3.5 Tipo ENUM


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 ENUMsintaxis de tipo y la limitación de longitud.

ENUMEl 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. ENUMPara 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 BYuso de ENUMcolumnas 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 ENUMtabla 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 100valor de un millón de líneas 'medium'en la tabla requieren 100un millón de bytes de espacio de memoria, y si la cadena real 'medium'en la VARCHARcolumna de almacenamiento se requiere 600un 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 1principio.
  • El valor de índice del valor de error de cadena vacía es 0. Esto significa que puede usar la siguiente SELECTdeclaración para buscar ENUMfilas que especifiquen valores no válidos :
mysql> SELECT * FROM tbl_name WHERE enum_col=0;
  • NULLEl índice del valor es NULL.
  • 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 ENUMcolumna puede tener como máximo 65,535un elemento diferente.

Si el valor se recupera en un contexto numérico, ENUMse devuelve el índice del valor de la columna. Por ejemplo, puede ENUMrecuperar 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 ENUMvalor, 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 ENUMvalores de los miembros en la definición de la tabla .

Al recuperar, ENUMlos 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 ENUMcolumna, 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 DATAno funciona, LOAD DATAtodas 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, 2y 3:

numbers ENUM('0','1','2')

Si se almacena 2, se interpretará como el valor del índice y se convertirá en '1'( 2el 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'( 3valor del índice ).

mysql> INSERT INTO t (numbers) VALUES(2),('2'),('3');
mysql> SELECT * FROM t;
+---------+
| numbers |
+---------+
| 1       |
| 2       |
| 2       |
+---------+

Para determinar ENUMtodos los valores posibles de SHOW COLUMNS FROM tbl_name LIKE 'enum_col'una Typecolumna , use ENUMla 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 cadena 0. 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 insertar ENUMvalores no válidos provocarán un error.
  • Si la ENUMcolumna se declara como permitida NULL, el NULLvalor es un valor válido para la columna y el valor predeterminado es NULL. Si una ENUMcolumna se declara como negativa NULL, su valor predeterminado es el primer elemento de la lista de valores permitidos.

Orden de enumeración

ENUMLos 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 NULLvalores se ordenan antes que todos los demás valores enumerados.

Para evitar resultados inesperados al ENUMutilizar ORDER BYcláusulas en columnas , puede utilizar una de las siguientes técnicas:

  • Especifique la ENUMlista 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)o ORDER 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 TABLEdeclaración no funcionará porque las CONCATfunciones 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 TINYINTo el SMALLINTtipo 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.

Supongo que te gusta

Origin blog.csdn.net/wb1046329430/article/details/114786368
Recomendado
Clasificación