繁体   English   中英

MySQL意外结果:varchar列上的“ IN”子句(数字,“字符串”)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM