【问题标题】:Unexpected result using SELECT ... WHERE id = 0 on VARCHAR id in MySQL在 MySQL 的 VARCHAR id 上使用 SELECT ... WHERE id = 0 出现意外结果
【发布时间】:2018-10-06 09:47:44
【问题描述】:

我正在使用带有 InnoDB 的 MySQL 8 和带有 mysql2 驱动程序的节点服务器。

我的桌子是这样的:

CREATE TABLE IF NOT EXISTS users(
      id VARCHAR(36) NOT NULL,
      name VARCHAR(32) NOT NULL,
      email VARCHAR(255) NOT NULL,
      ...
      PRIMARY KEY (id) 
     )

我不使用自动增量,并且作为 VARCHAR id,我使用基于时间的 UUID。

如果我现在执行 SELECT 查询:

SELECT * FROM users where id = 'some valid id';

我得到了我的预期结果。

如果我这样做:

SELECT * FROM users where id = '0';

我什么也得不到,因为我的表中没有任何 id 的值为 '0'。

但是,如果我这样做:

SELECT * FROM users where id = 0;

我得到最后插入的行,当然,它有一个不同于 0 的有效 VARCHAR id。

这种行为是偶然发生在我的节点服务器上的,因为 JS 有时会在 http 查询中将 undefined 解释为 0。 因此,我可以很容易地避免在我的查询中插入 0(我现在所做的),但我想了解为什么会发生这种情况。

【问题讨论】:

  • 您能否举例说明第三种情况 where id = 0; 的查询返回的此类 ID 的示例?

标签: mysql sql node.js


【解决方案1】:

你的idvarchar(),所以这个比较:

WHERE id = 0

需要类型转换。

根据SQL中的转换规则,id变成了字符串。现在,在许多数据库中,如果 id 的任何值无法转换为数字,您会收到错误消息。

然而,MySQL 支持隐式转换没有错误。 (您可以在documentation 中了解这种转换。)这会将所有前导数字转换为数字——忽略其余部分。如果没有前导数字,则该值为零。所以,所有这些在 MySQL 中都是正确的:

  • 'a' = 0
  • '0a' = 0'
  • 'anything but 0!' = 0

这个故事有两个寓意。

  1. 如果您确实希望id 是数字,请使用数字数据类型(intbigintdecimal)。
  2. 不要在比较中混合类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2023-03-20
    • 2013-05-02
    • 2020-08-01
    • 1970-01-01
    • 2011-02-07
    • 2010-11-03
    相关资源
    最近更新 更多