代码之家  ›  专栏  ›  技术社区  ›  Jacky Wang

为什么在mysql where子句中忽略“-1”name=123456789123456789-1

  •  2
  • Jacky Wang  · 技术社区  · 6 年前

    CREATE TABLE `person` (
      `person_id` bigint(20) NOT NULL AUTO_INCREMENT,
      `name` varchar(64) DEFAULT NULL,
      PRIMARY KEY (`person_id`),
      KEY `ix_name` (`name`)
    ) ENGINE=InnoDB CHARSET=utf8
    

    然后我们准备了两份测试记录 name 字段(varchar类型)是

    • 1

    分别。

    select * from person where name = 123456789123456789-1;
    

    注意,我们在where子句中使用的是数字而不是字符串。名为的记录 123456789123456789 -1 最后都被忽略了!

    此外,我们还添加了另一个名为= 123456789123456788 123456789123456789 ;

    输出看起来很奇怪!

    案例2

    select * from person where name = 123456789123456789-123456789123456788;
    

    我们可以拿到名字的唱片 1 - 充当减号运算符。

    为什么 - 在两种情况下是如此不同!

    2 回复  |  直到 4 年前
        1
  •  2
  •   Damien_The_Unbeliever    6 年前

    我不能马上告诉你 123456789123456789-1 如果不是比较的话,我们几乎可以肯定会通过大多数更“正常的” data type conversion rules 对于mysql,结果是:

    在所有其他情况下,参数作为浮点数(实数)进行比较。

    name )一个是字符串类型,另一个是数字类型,没有其他匹配项。所以这两种类型都被转换成float,并且float类型没有太多的精度数字。当然少于将123456789123456789和123456788作为两个代表所需的18个 不同的

        2
  •  0
  •   Community CDub    4 年前

    看这里:

    SELECT person_id, name, name + 0.0, 123456789123456789-1 + 0.0,  name = 123456789123456789-1
    FROM person
    ORDER BY person_id;
    

    也许,在比较之前 name = 123456789123456789-1 MySQL转换 name 123456789123456789-1 DOUBLE

    Demo .