代码之家  ›  专栏  ›  技术社区  ›  Michael Samuel

带有前导零的MYSQL查询返回与不带前导零相同的结果

  •  2
  • Michael Samuel  · 技术社区  · 10 年前

    我有一个带有自动增量的简单MySQL表 id 作为主键。

    假设我想选择第一个 身份证件 ,我运行以下查询:

    SELECT * FROM table WHERE id = '1'
    

    我错误地尝试了下面的查询,它返回了相同的结果,尽管它应该返回空结果。

    SELECT * FROM table WHERE id = '01'
    

    这会导致我的网站上出现重复的URL以及许多问题,如无效的文件引用等。这是bug吗?

    2 回复  |  直到 10 年前
        1
  •  2
  •   Dylan Su    10 年前

    如果id是整数,则与预期的一样。

    这里完成了向兼容类型的隐式类型转换。

    mysql> select 1 = '01', 1 = '1', '1' = '01';
    +----------+---------+------------+
    | 1 = '01' | 1 = '1' | '1' = '01' |
    +----------+---------+------------+
    |        1 |       1 |          0 |
    +----------+---------+------------+
    1 row in set (0.00 sec)
    
        2
  •  1
  •   Giorgos Betsos    10 年前

    如前所述,您得到结果的原因是 隐式类型转换 :将“1”或“01”转换为整数,使其与 id 领域 之前 进行比较。

    解决这个问题的一个快速而肮脏的方法是 CAST 字段,如:

    SELECT *
    FROM mytable 
    WHERE CAST(id AS CHAR(10)) = '1'
    

    当然,最好的方法是清理应用程序的数据。

    Demo here