为何带WHERE条件的SELECT 1语句未匹配到数据时仍返回1?
问题原因排查
你贴出的这条SQL本身逻辑是符合预期的:如果my_table为空,或没有ip值等于INET_ATON('127.0.0.1')的记录,正常情况下只会返回空结果集,不会返回1。出现异常返回可以从以下几个方向排查:
- 实际执行的SQL与你粘贴的内容不一致
这是最高概率的原因,多为语法书写错误导致WHERE条件失效:- 误加
--、/* */等注释符注释了部分/全部WHERE子句,导致查询没有过滤条件,只要表中存在任意数据就会返回1;如果语句中额外加了UNION SELECT 1这类写法,哪怕表为空也会返回固定的1 - 逻辑运算符优先级错误,比如WHERE条件写为
ip = INET_ATON('127.0.0.1') OR 其他永远为真的条件,会导致过滤规则失效
- 误加
- 字段类型或值匹配异常
- 如果你的
ip字段是字符串类型(存储点分十进制格式的IP),拿数字类型的INET_ATON('127.0.0.1')(返回值为2130706433)和字符串做等值匹配时,MySQL会做隐式类型转换,若表中刚好存在ip字段值以2130706433开头的字符串记录,也会触发匹配返回1 - 确认你传入的IP字符串是否合法,
INET_ATON处理非法IP时会返回NULL,如果后续条件书写错误(比如误写为ip = NULL或多拼了永远为真的OR条件),也可能触发异常返回
- 如果你的
- 缓存或客户端异常
老版本MySQL若开启了查询缓存,之前执行过无过滤条件的同类查询命中缓存时,可能返回旧的缓存结果,可执行RESET QUERY CACHE后重试
部分数据库客户端会对执行错误的语句返回默认值,可查看数据库的SQL执行日志确认语句是否真的执行成功、没有报错
你可以先执行两条验证语句缩小排查范围:
- 执行
SELECT COUNT(*) FROM my_table确认表是否真的为空 - 执行
SELECT * FROM my_table WHERE ip = INET_ATON('127.0.0.1')查看是否存在匹配的记录
内容的提问来源于stack exchange,提问作者user3052443
相关产品推荐
相关产品推荐

