不应返回任何内容的MySQL查询,返回一条记录

时间:2019-08-16 19:22:26

标签: mysql

所以我正在写一个查询以提取记录。它会:

SELECT dossier.*
FROM dossier
WHERE dossier.id = '097a520ef2be66c53506cb0f3552557e'
LIMIT 1

我的id字段是INT。有id为97的记录,但不是 097a520ef2be66c53506cb0f3552557e,因此我不应该拿回任何记录。

但是我只获取记录:https://prnt.sc/otn1uz

有关如何正确查询该字段以及导致MySQL错误思考的任何想法
97 = 097a520ef2be66c53506cb0f3552557e?

1 个答案:

答案 0 :(得分:1)

如注释中所述,当您将字符串与整数进行比较时,MySQL首先会自动将字符串转换为整数。如果字符串包含数字前缀,则将其转换为该数字,否则它将变为0

避免这种情况的一种方法是在比较之前将整数转换为字符串:

WHERE CAST(dossier.id AS CHAR) = '097a520ef2be66c53506cb0f3552557e'

另一种解决方案是使用LIKE而不是=。由于这是字符串操作,因此它将首先自动将数字转换为字符串。

WHERE dossier.id LIKE '097a520ef2be66c53506cb0f3552557e'

LIKE通常比=效率低,因为它执行模式匹配,但是我认为如果模式中没有通配符,MySQL会将其优化为质量测试。

但是,这些方法都不能利用ID字段上的索引。最好的解决方案是首先避免将INT列与任意字符串进行比较。