MySQL WHERE条件未匹配任何行却返回查询结果的原因说明
问题复现
- 测试表为
roles,表结构如下:
- 执行如下SQL查询:
SELECT * FROM roles WHERE role_id = "1ojosd041l"
- 预期结果:字符串
"1ojosd041l"和表内所有role_id值都不匹配,返回空集 - 实际结果:查询成功返回了一行数据,返回结果如下:

官方原理解释
这个现象确实是字段类型和传入参数类型不匹配触发隐式转换导致的,对应MySQL官方文档定义的类型转换规则:
- 当比较运算符两侧操作数类型不一致时,MySQL会自动做隐式类型转换,对齐两侧类型后再做比较
- 如果一侧是整数类型、另一侧是字符串,转换方向是将字符串转为数值,不会将整数字段转为字符串
- 字符串转数值的解析规则为:从字符串起始位置开始逐位读取数字字符,遇到第一个非数字字符就终止解析,返回已读取到的数字值;如果字符串开头就不是数字或正负号,直接返回0
对应你这条查询的实际执行逻辑:
role_id是int类型,右侧传入的是字符串"1ojosd041l",触发字符串转数值逻辑- 解析字符串时,第一位读取到数字
1,第二位是字母o(非数字字符),直接终止解析,最终转换得到的数值是1 - 这条SQL实际等价于执行:
SELECT * FROM roles WHERE role_id = 1
自然就返回了表中role_id=1的那行数据,和截图返回结果完全一致。
注意:这类隐式转换不仅会造成查询结果不符合预期,还会让
role_id字段上的索引失效,拖慢查询性能,写查询时一定要保证传入参数的类型和字段类型一致。
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

