[英]MySQL Unexpected Results: “IN”-clause (number, 'string') on a varchar column
在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:我也在数字列上尝试过此操作,但在那里没有得到意外结果。
您的表情是:
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
这将返回true,false,true。 但是,请注意,在这种情况下val in (-1, 'B')
中的val in (-1, 'B')
返回FALSE。 MySQL对空字符串的处理与对实际字符串的处理有所不同,这可能与文档不一致。
对于列,这是正确的:
select val in (0)
from (select 'A' as val) t;
谁说逻辑不好玩?
要解决此问题,可以使列表全部具有一致的类型,方法可能是在数字周围加上单引号。
如比较功能和运算符所述 :
切勿在
IN
列表中混用带引号和不带引号的值,因为带引号的值(例如字符串)和未带引号的值(例如数字)的比较规则不同。 因此,混合类型可能导致结果不一致。 例如,不要这样写一个IN
表达式:SELECT val1 FROM tbl1 WHERE val1 IN (1,2,'a');
而是这样写:
SELECT val1 FROM tbl1 WHERE val1 IN ('1','2','a');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.