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
SELECTpara encontrar linhas nas quais valoresENUMinvá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.