我有一个使用IN子句的MySQL查询。
URLConnection connection = url.openConnection();
connection.setConnectTimeout(1000);
connection.setReadTimeout(1000);
connection.connect();
但是,我偶然发现了一个案例,其中SomeOtherColumn的值为0,MySQL将where子句计算为TRUE:
SELECT SomeColumn
FROM SomeTable
WHERE SomeOtherColumn IN ('Some', 'Set')
评估到
SELECT 0 IN ('Some', 'Set')
MySQL版本5.5.46。任何人都知道为什么会这样?
答案 0 :(得分:5)
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
答案 1 :(得分:0)
您应该将0
转换为varchar
:
select '0' in ('Some', 'Set')
将评估为0
。