【问题标题】:WHERE a OR b IN (x) does not match, but returns rowsWHERE a OR b IN (x) 不匹配,但返回行
【发布时间】:2018-03-09 13:26:07
【问题描述】:

我的桌子是这样的:

| 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', '');

【问题讨论】:

  • 我的猜测是字符串被转换成整数。
  • @Uueerdo 很好的猜测,谢谢!有没有通用的预防措施来避免这种情况?
  • 我唯一能想到的就是不要在涉及相等的表达式中混合数字和字符串类型,除非你能保证字符串解析正确。
  • 请注意x IN (single-item)x = single-item基本相同。

标签: mysql sql where-clause where-in


【解决方案1】:

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

如果所有值都是常量,则根据类型对它们进行评估 表达的

换句话说,"asdewdwedewd" 将被视为 int。当 mysql 将其转换为 int cast("asdewdwedewd" as signed integer) 时,我们得到 0。因此0 in (0) 的计算结果为真。

【讨论】:

    【解决方案2】:

    优化器将数据归为同一类型。 将字符串转换为十进制时,我们得到零。 需要预先定义或转换数据类型。

    【讨论】:

    • 字符串到十进制并不总是产生 0;例如,将“1.5676asdafnenawuiawuin”和“1asdkjaklfkl”转换为 DECIMAL(5,2) 分别得到 1.57 和 1.00。
    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 2019-05-18
    相关资源
    最近更新 更多