所以我正在写一个查询以提取记录。它会:
SELECT dossier.*
FROM dossier
WHERE dossier.id = '097a520ef2be66c53506cb0f3552557e'
LIMIT 1
我的id
字段是INT
。有id
为97的记录,但不是 097a520ef2be66c53506cb0f3552557e
,因此我不应该拿回任何记录。
但是我只获取记录:https://prnt.sc/otn1uz
有关如何正确查询该字段以及导致MySQL错误思考的任何想法
97 = 097a520ef2be66c53506cb0f3552557e?
答案 0 :(得分:1)
如注释中所述,当您将字符串与整数进行比较时,MySQL首先会自动将字符串转换为整数。如果字符串包含数字前缀,则将其转换为该数字,否则它将变为0
。
避免这种情况的一种方法是在比较之前将整数转换为字符串:
WHERE CAST(dossier.id AS CHAR) = '097a520ef2be66c53506cb0f3552557e'
另一种解决方案是使用LIKE
而不是=
。由于这是字符串操作,因此它将首先自动将数字转换为字符串。
WHERE dossier.id LIKE '097a520ef2be66c53506cb0f3552557e'
LIKE
通常比=
效率低,因为它执行模式匹配,但是我认为如果模式中没有通配符,MySQL会将其优化为质量测试。
但是,这些方法都不能利用ID字段上的索引。最好的解决方案是首先避免将INT
列与任意字符串进行比较。