简单查询执行异常求助:返回结果异常(46/44/无结果)该排查什么?
兄弟,我太懂这种状态欠佳时脑子卡壳的感觉了——明明本该一目了然的简单查询,结果输出乱七八糟的,越急越摸不着头绪!结合你说的返回46、44、空值的混合情况,我猜你可能漏掉了这几个细节:
字段类型不匹配的隐形坑:比如你查询的字段是数字类型,但条件里传了字符串(或者反过来)?比如数据库里
id是int类型,你写WHERE id = '46',有些数据库会自动做类型转换,但如果遇到空字符串或格式错误的内容,就可能返回空值或奇怪的匹配结果;反过来如果字段是字符串类型,你用数字去匹配,也可能出现部分匹配的情况。没处理
NULL值的特殊情况:如果目标字段里存在NULL的记录,而你的查询条件写的是WHERE field = ''或者WHERE field != '',那NULL的记录是不会被匹配到的——数据库里NULL不等于任何值,包括空字符串。如果有的记录字段值是46、44,有的是NULL,就会出现你说的混合结果。循环/批量查询的变量未更新:如果这几次查询是循环执行的(比如脚本、循环调用接口),有没有可能循环里的查询变量没正确赋值?比如第一次循环变量是46,第二次是44,后面两次变量意外变成空值,导致查询条件为空,自然返回空结果?这种低级错误在状态不好的时候特别容易犯,比如漏写了变量更新的代码。
忽略了数据本身的变化:先别死磕查询语句,去看看数据库里的原始数据!是不是有的记录对应字段就是46、44,有的是空值?或者有没有其他进程在你查询期间修改了数据?比如前两次查询时数据还在,后面两次被删掉或更新成空值了?
查询语句的隐性语法错误:比如有没有漏写逻辑运算符?比如本来是
WHERE a = 1 AND b = ?,结果写成了WHERE a = 1 b = ?(漏了AND),数据库可能会解析成奇怪的语法,导致部分匹配;或者字段名写错了?比如把order_id写成了order_num,刚好表里有个冷门的order_num字段,里面刚好有46、44的值,后面的记录这个字段是空?
建议你先把每次执行的查询语句完整打印出来,对比每次的条件差异,再去核对对应的数据,应该能很快找到问题!
内容的提问来源于stack exchange,提问作者StephenGB

