mysql - 不应该返回任何东西的 MySQL 查询,返回一条记录
问题描述
所以我正在编写一个查询来提取记录。它去:
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
列与任意字符串进行比较。
推荐阅读
- java - 如何避免 VS Code 警告:“[myfile].java 是非项目文件,只报告语法错误”
- python - 对于 CPython 实现,id(x) 是存储 x 的内存地址吗?
- python-3.x - BeautifulSoup:选择特定的节和类
- .net-core - 在 .net 核心应用程序的构建/发布中包含自定义文件
- arduino - 在 SRAM arduino 中看不到的全局变量
- javascript - 在 React 中映射数组 onClick 按钮
- c - 字符串和 sscanf
- c# - 将 ControlTemplate 子绑定到自定义控件上的 DependencyProperty 不起作用
- arduino-ide - 以毫秒为单位获取 ntp 时间
- ios - 在 AppDelegate.swift 中的 Firebase Google SignIN 后 HomeViewController 未加载