作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在编写一个查询来提取记录。它是这样的:
SELECT dossier.*
FROM dossier
WHERE dossier.id = '097a520ef2be66c53506cb0f3552557e'
LIMIT 1
我的id
字段是INT
。有一条 id
为 97 的记录,但不是097a520ef2be66c53506cb0f3552557e
,所以我应该拿不到任何记录。
但我刚刚取回记录:https://prnt.sc/otn1uz
关于如何正确查询该字段的任何想法,以及什么会导致 MySQL 错误地思考
97 = 097a520ef2be66c53506cb0f3552557e?
最佳答案
正如评论中提到的,当你将字符串与整数进行比较时,MySQL会首先自动将字符串转换为整数。如果字符串包含数字前缀,则将其转换为该数字,否则将变为 0
。
避免这种情况的一种方法是在比较之前将整数转换为字符串:
WHERE CAST(dossier.id AS CHAR) = '097a520ef2be66c53506cb0f3552557e'
另一个解决方案是使用LIKE
而不是=
。由于这是字符串操作,所以会先自动将数字转换为字符串。
WHERE dossier.id LIKE '097a520ef2be66c53506cb0f3552557e'
LIKE
通常比 =
效率低,因为它执行模式匹配,但我假设当 中没有通配符时 MySQL 会将其优化为质量测试模式。
但是,这些都无法利用 ID 字段上的索引。最好的解决方案是首先避免将 INT
列与任意字符串进行比较。
关于MySQL 查询不应返回任何内容,返回一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57530069/
我是一名优秀的程序员,十分优秀!