我有一个简单的MySQL表,其中自动递增id
作为主键。
假设我想选择第一个id
,我运行以下查询:
SELECT * FROM table WHERE id = '1'
我错误地尝试了以下查询并返回了相同的结果,尽管它应该返回空结果。
SELECT * FROM table WHERE id = '01'
这导致我的网站上出现重复的网址以及许多问题,例如无效的文件引用等。这是一个错误吗?
答案 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'
当然,最好的方法是清理应用程序的数据。