gpt4 book ai didi

MySQL 意外结果 : "IN"-clause (number, 'string' ) 在 varchar 列上

转载 作者:行者123 更新时间:2023-12-01 00:48:20 24 4
gpt4 key购买 nike

在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

这会返回真、假、真。但是,请注意 val in (-1, 'B') 在这种情况下返回 FALSE。 MySQL 对空字符串的处理方式与实际字符串不同,这可能与文档不一致。

对于列也是如此:

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

谁说逻辑不能有趣?

要解决此问题,请使列表都具有一致的类型,可能是通过在数字周围加上单引号。

关于MySQL 意外结果 : "IN"-clause (number, 'string' ) 在 varchar 列上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18664793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com