MySQL 0 输入 ("Some", "Set")

MySQL 0 IN ("Some", "Set")

我有一个使用 IN 子句的 MySQL 查询。

SELECT SomeColumn
FROM SomeTable
WHERE SomeOtherColumn IN ('Some', 'Set')

但是,我偶然发现了一个案例,其中 SomeOtherColumn 的值为 0,并且 MySQL 将 where 子句评估为 TRUE:

SELECT 0 IN ('Some', 'Set')

评估为

1 (TRUE)

MySQL 版本 5.5.46。任何人都知道为什么会这样?

0 被解释为数字文字。

括号中的值也被评估为数字文字。 IN 列表中的两个值的计算结果都是 0 的数值。

(与其他数据库不同,MySQL 在向数字的隐式转换方面有些慷慨。它不会抛出 "Invalid number" 错误,而是尽其所能,并且 returns结果。)

比较:

评估为字符串文字和比较:

 SELECT '0' IN ('Some','Set')

计算为数字文字:

 SELECT 0 IN ('1foo','2bar')

测试转换为数字:

 SELECT 'Some' + 0, 'Set' + 0

 SELECT '1foo' + 0, '2bar' + 0

您应该将 0 转换为 varchar:

select '0' in ('Some', 'Set') 将计算为 0.