问题背景:一条简单的select查询语句,数据库返回结果不正确,比方说我查询条件是 where A = a1,实际mysql的返回结果是a1,a2两条都给返回了,详见图示。因为表不是本人建立的,所以定位这个问题的时候走了点弯路。下面是详细的分析过程。
分析过程:1.看起来查询条件数字很长,首先怀疑是不是数据超过了bigint的最大值,导致数据被截取(现在想想挺傻的,明明存数据已经成功)
2.想起来看看id列的数据类型,查看完发现是varchar,额,大概发现了问题,那在查询条件上加单引号试试,结果返回一条,且结果是正确的。问题解决,但是原因还要进一步探究。
3.进一步联想,这个类型不匹配的查询条件,数据库是怎么处理的呢,经过查询相关资料,得出以下结论。
a.在字符串和数值作比较的时候,字符串和数值都会转换成浮点数进行比较。
b.字符串在转浮点数时,如果字符串开头是数字,那就一直截取,直到截取到的不是数字是其他字符为止。若开头不是数字,那么转换数值类型的结果就直接取0。(如’123abc’转成的值是123,'ab123’取到的值是0)
c.在上述中,我的字符串存储的是19位varchar类型。由于在转换成浮点数的时候,数值太大会自动转换成科学计数法,而且浮点数的精度不准确,都是取近似值,所以会出现意外的内容。也就是说我的查询sql条件在用数值类型时,由于数值太大了,所以在转换成浮点数的时候变成了科学计数法,同理被查询的字段也被转换成了浮点数的科学计数法,又由于浮点数精度的不准确,导致查询结果出现不准确。
d.如果用了字符串字段,在查询的时候最好不要用数值(如整数之类的)来查询,因为如果用数值查询,也就是如上面说的,MySql会自动把表达式中的值都转换成浮点数。而这里索引字段varchar类型进行自动转换成了浮点数,导致了索引失效。
参考:https://blog.csdn.net/weixin_43606226/article/details/105994535
网友评论