这篇非常有用的文章解释了有关MySQL 枚举行为的一些奇怪之处:http : //melp.nl/2009/05/mysql-enums-and-booleans/
没有关于为什么存在这种行为的讨论。此外,在谷歌搜索这个主题时,我发现只有相互矛盾的信息和推测,由“博主”和其他盲人引导。
有人可以描述一下为什么 MySQL 枚举会遭受帖子中概述的行为。这是帖子中介绍的 Enum 奇怪之处的一个示例,但还有更多示例:
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)
Run Code Online (Sandbox Code Playgroud)
在SELECT
你的榜样应该是与一致INSERT
与它采用的报价方式。以下工作:
select b,b='1',b='0' from t;
Run Code Online (Sandbox Code Playgroud)
这是证据。
MySQL的枚举文件解释说,一个枚举是一个指数的字符串-每个条目同时具有数字索引和一个字符串值。SELECT
您问题中的查询使用的是 numeric index,而我提供的查询是在您插入字符串时使用它们。
文档中还指出,第一个值的索引始终为 1,而索引 0 始终解析为空字符串 ('')。('0','1','3','Banana','2')
因此,枚举看起来像这样:
Index = 'Value'
0 = ''
1 = '0'
2 = '1'
3 = '3'
4 = 'Banana'
5 = '2'
Run Code Online (Sandbox Code Playgroud)
在上面的示例中 - 以及您的原始示例 -select b,b=1,b=0 from t;
将查找索引 0 和 1,它们分别解析为值''
和0
。
在处理枚举数据时,您几乎永远不需要使用索引 - 确保使用字符串值,并每次都在它们周围加上引号。
作为一般规则,不要使用enum
类型来存储数字。混淆的风险非常高,如果你真的想限制值,还有其他合适的工具,比如带有外键的查找表。