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
.
我有一个使用 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
.