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

时间:2016-02-16 12:41:37

标签: mysql sql

我有一个简单的MySQL表,其中自动递增id作为主键。

假设我想选择第一个id,我运行以下查询:

SELECT * FROM table WHERE id = '1'

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

SELECT * FROM table WHERE id = '01'

这导致我的网站上出现重复的网址以及许多问题,例如无效的文件引用等。这是一个错误吗?

2 个答案:

答案 0 :(得分:2)

如果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)

答案 1 :(得分:1)

如前所述,您获得结果的原因是隐式类型转换:' 1'或者' 01'转换为整数,以便在进行比较之前匹配id字段的类型。

解决此问题的快速而肮脏的解决方案是CAST字段,例如:

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

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

Demo here