我有一个使用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被解释为数字文字.
parens中的值也被评估为数字文字.并且IN列表中的两个值都计算为0的数值.
(与其他数据库不同,MySQL在隐式转换为数字时有点慷慨.而不是抛出“无效数字”错误,它会尽力而为,并返回结果.)
相比于:
评估为字符串文字和比较:
SELECT '0' IN ('Some','Set')
评估为数字文字:
SELECT 0 IN ('1foo','2bar')
测试转换为数字:
SELECT 'Some' + 0, 'Set' + 0
SELECT '1foo' + 0, '2bar' + 0