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

Wun*_*nsz 3 mysql sql clause where

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

SELECT SomeColumn
FROM SomeTable
WHERE SomeOtherColumn IN ('Some', 'Set')
Run Code Online (Sandbox Code Playgroud)

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

SELECT 0 IN ('Some', 'Set')
Run Code Online (Sandbox Code Playgroud)

评估到

1 (TRUE)
Run Code Online (Sandbox Code Playgroud)

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

spe*_*593 5

0被解释为数字文字.

parens中的值也被评估为数字文字.并且IN列表中的两个值都计算为数值0.

(与其他数据库不同,MySQL在隐式转换为数字时有点慷慨.而不是抛出"无效数字"错误,它会尽力而为,并返回结果.)

相比于:

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

 SELECT '0' IN ('Some','Set')
Run Code Online (Sandbox Code Playgroud)

评估为数字文字:

 SELECT 0 IN ('1foo','2bar')
Run Code Online (Sandbox Code Playgroud)

测试转换为数字:

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

 SELECT '1foo' + 0, '2bar' + 0
Run Code Online (Sandbox Code Playgroud)