O Tipo ENUM
Um ENUM
é um objeto string cujo valor normalmente é escolhido de uma lista de valores permitidos que são enumerados explicitamente na especificação da coluna na criação da tabela.
O valor pode ser a string vazia (''
) ou NULL
sob certas circunstâncias:
- Se você inserir um valor inválido em um
ENUM
(isto é, uma string que não está presente na lista de valores permitidos), a string vazia é inserida no lugar como um valor especial de erro. Esta string pode se diferenciar de um string vazia 'norma' pelo fato de que esta string tem uo valor numérico 0. Veremos mais sobre este assunto mais tarde. - Se um
ENUM
é declaradoNULL
,NULL
é também um valor permitido para a coluna, e o valor padrao éNULL
. Se umENUM
é decalaradoNOT NULL
, o valor padrão é o primeiro elemento da lista de valores permitidos.
Cada enumeração tem um índice:
- Valores da lista de elementos permitidos na especificação da coluna são números começados com 1.
- O valor de índice de uma string vazia que indique erro é 0. Isto significa que você pode usar a seguinte instrução
SELECT
para encontrar linhas nas quais valoresENUM
inválidos forma atribuidos:mysql>
SELECT * FROM nome_tabela WHERE col_enum=0;
- O índice de um valor
NULL
éNULL
.
Por exemplo, uma coluna especificada como ENUM('um', 'dois', 'três')
pode ter quqlquer um dos valores mostrados aqui. O índice de cada valor também é mostrado:
Valor | Indice |
NULL
| NULL
|
''
| 0 |
'um'
| 1 |
'dois'
| 2 |
'três'
| 3 |
Uma enumeração pode ter um máximo de 65535 elementos.
A partir da versão 3.23.51 espaços extras são automaticamente deletados dos valores ENUM
quando a tabela é criada.
O caso da letra é irrelevante quando você atribui valores a um coluna ENUM
. No entanto, valores recuperados posteriormente da coluna terá o caso de letras de acordo com os valores que foram usados para especificar os valores permitidos na criação da tabela.
Se você recupera um ENUM
em um contexto numérico, o indice do valor da coluna é retornado. Por exemplo, você pode recuperar valores numéricos de uma coluna ENUM
desta forma:
mysql> SELECT col_enum+0 FROM nome_tabela;
Se você armazena um número em um ENUM
, o número é tratado como um índice, e o valor armazenado é o membro da enumeração com este índice. (No entanto, este não irá funcionar com LOAD DATA
, o qual trata todas as entradas como strings.) Não é aconselhável armazenar números em uma string ENUM
pois pode tornar as coisas um pouco confusas.
Valores ENUM
são armazenados de acordo com a ordem na qual os membros da enumeração foram listados na especificação da coluna. (Em outras palavras, valores ENUM
são ordenados de acordo com o seus números de índice.) Por exemplo, 'a'
vem antes de 'b'
para ENUM('a', 'b')
, mas 'b'
vem antes de 'a'
para ENUM('b', 'a')
. A string vazia vem antes de strings não-vazias, e valores NULL
vem antes de todos os outros valores de enumeração. Para evitar resultados inesperados, especifique a lista ENUM
em ordem alfabética. Você também pode usar GROUP BY CONCAT(col)
para ter certeza de que as colunas estão ordenadas alfabeticamente e não pelo índice numérico.
Se você quiser obter todos os valores possíveis para uma coluna ENUM
, você deve usar: SHOW COLUMNS FROM nome_tabela LIKE nome_coluna_enum
e analizar a definição de ENUM
na segunda coluna.