Este artigo muito útil explica algumas curiosidades sobre como o MySQL Enums se comporta : http://melp.nl/2009/05/mysql-enums-and-booleans/
Não há discussão sobre por que esse comportamento existe. Além disso, ao pesquisar o assunto no Google, encontro apenas informações e especulações contraditórias, de 'blogueiros' e outros cegos guiando outros cegos.
Alguém pode descrever por que o MySQL Enums sofre com o comportamento descrito na postagem. Aqui está um exemplo de esquisitices do Enum apresentadas no post, mas há muito mais:
mysql> insert into t values('1'),('0');
mysql> select b,b=1,b=0 from t;
+---+-----+-----+
| b | b=1 | b=0 |
+---+-----+-----+
| 1 | 0 | 0 |
| 0 | 1 | 0 |
+---+-----+-----+
2 rows in set (0.00 sec)
O
SELECT
no seu exemplo deve ser consistente comINSERT
a forma como ele usa aspas. As seguintes obras:Aqui está a prova .
A documentação enum do MySQL explica que um enum é um índice de strings - cada entrada tem um índice numérico e um valor de string. A
SELECT
consulta em sua pergunta está usando o índice numérico e o que forneci está usando as strings conforme você as inseriu.Também observado na documentação é que o primeiro valor sempre tem um índice de 1 e que o índice 0 sempre resolve para uma string vazia (''). Uma enumeração de
('0','1','3','Banana','2')
ficaria assim:No exemplo acima - assim como no exemplo original -
select b,b=1,b=0 from t;
procurará os índices 0 e 1, que resolvem para os valores''
e0
respectivamente.Você quase nunca precisará usar os índices ao trabalhar com dados enum - certifique-se de usar os valores de string e coloque aspas em torno deles sempre.
Como regra geral, não use
enum
tipos para armazenar números . O risco de confusão é altíssimo, e se você realmente quer restringir os valores, existem outras ferramentas adequadas, como tabelas de consulta com chaves estrangeiras.