首页 > 解决方案 > 不应该返回任何东西的 MySQL 查询,返回一条记录

问题描述

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

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

我的id领域是INT。有id97 的记录,但没有 097a520ef2be66c53506cb0f3552557e,所以我不应该找回任何记录。

但我只是拿回记录:https ://prnt.sc/otn1uz

关于如何正确查询该字段的任何想法,以及什么会导致 MySQL 错误地认为
97 = 097a520ef2be66c53506cb0f3552557e?

标签: mysql

解决方案


正如评论中提到的,当您将字符串与整数进行比较时,MySQL 会首先自动将字符串转换为整数。如果字符串包含数字前缀,则将其转换为该数字,否则变为0.

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

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

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

WHERE dossier.id LIKE '097a520ef2be66c53506cb0f3552557e'

LIKE通常效率低于=它执行模式匹配,但我假设当模式中没有通配符时 MySQL 会将其优化为质量测试。

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


推荐阅读