0

在 MySQL 中,为什么下面的查询返回'----', '0', '000', 'AK3462', 'AL11111', 'C131521', 'TEST', 等等?

select varCharColumn from myTable where varCharColumn in (-1, '');

当我这样做时,我没有得到这些结果:

select varCharColumn from myTable where varCharColumn in (-1);
select varCharColumn from myTable where varCharColumn in ('');



注意:我使用的是 MySQL 版本 5.0.45-log ( show variables like "%version%";)

注意 2:我也在数字列上尝试过这个,但在那里我没有得到意外的结果。

4

2 回答 2

3

你的表达是:

where varCharColumn in (-1, '')

该列表必须具有一致的类型。第一个元素表示“这是一个整数列表”,因此第二个值被转换为整数。并''变成0

事实上,任何以非数字开头的字母数字字符串也会转换0为整数比较。所以,你有这种情况

'A' in (0)   --> TRUE
'B' in (0)   --> TRUE
'A' in ('B') --> FALSE

您可以通过以下方式轻松测试:

select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');

您可以通过一列查看它的实际效果:

select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t

这将返回真、假、真。但是,请注意val in (-1, 'B')在这种情况下返回 FALSE。MySQL 将空字符串与真实字符串区别对待,可能与文档不一致。

列是这样的:

select val in (0)
from (select 'A' as val) t;

谁说逻辑不能有趣?

要解决这个问题,可以通过在数字周围加上单引号来使列表都具有一致的类型。

于 2013-09-06T19:21:06.390 回答
2

比较函数和运算符下所述:

切勿在IN列表中混用带引号和不带引号的值,因为带引号的值(例如字符串)和不带引号的值(例如数字)的比较规则不同。因此,混合类型可能会导致结果不一致。例如,不要写这样的IN表达式:

SELECT val1 FROM tbl1 WHERE val1 IN (1,2,'a');

相反,这样写:

SELECT val1 FROM tbl1 WHERE val1 IN ('1','2','a');
于 2013-09-06T19:27:15.243 回答