2017-09-27 77 views
0

我的表看起来像这样:WHERE A或B IN(x)的不匹配,但返回的行

| a | ts_9 | ts_11 | 
|----|------|-------| 
| yx | 0 |  | 
| xy | 0 |  | 

出于某种原因,得到返回的行,当我打电话:

SELECT * FROM things WHERE ts_9 IN ("asdewdwedewd") OR ts_11 IN ("asdewdwedewd") 

为什么会发生?

随意重新创建与复制粘贴您的分贝:

CREATE TABLE `things` (
    `a` char(12) NOT NULL DEFAULT '', 
    `ts_9` decimal(2,0) NOT NULL, 
    `ts_11` char(1) NOT NULL DEFAULT '', 
    PRIMARY KEY (`a`), 
    UNIQUE KEY `a` (`a`)); 

INSERT INTO `things` (`a`, `ts_9`, `ts_11`) VALUES ('yx', '0', ''), ('xy', '0', ''); 
+3

我的猜测是字符串被转换为一个整数。 – Uueerdo

+0

@Uueerdo很棒的猜测,谢谢!有没有任何通用的预防措施来避免这种情况? – Basti

+0

我能想到的唯一的事情就是不要在涉及到相等的表达式中混合使用数字和字符串类型,除非您可以保证字符串正确解析。 – Uueerdo

回答

3

因为ts_9 IN ("asdewdwedewd")评估为真。更具体地说,ts_9具有整数0的值。根据documentation

如果所有的值是常数,它们是根据

换句话说,"asdewdwedewd"将被视为一个int expr的 型评价。当mysql将它转换为int cast("asdewdwedewd" as signed integer)时,我们得到0。因此0 in (0)评估为真。

0

优化带来的数据类型相同。 将字符串翻译为十进制时,我们得到零。 有必要预先定义或转换数据类型。

+0

字符串到小数不总是产生0;例如,将“1.5676asdafnenawuiawuin”和“1asdkjaklfkl”投射到DECIMAL(5,2)的结果分别为1.57和1.00。 – Uueerdo

相关问题