MySQL 枚举具有非直观行为,为什么?

dot*_*hen 1 mysql enum

这篇非常有用的文章解释了有关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)

Nat*_*lly 5

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类型来存储数字。混淆的风险非常高,如果你真的想限制值,还有其他合适的工具,比如带有外键的查找表。