Mysql--对varchar字段用int数值来查询的问题

在工作中遇到的一个问题。就是mysql的一个表中的一个字段是varchar类型的,这个字段用来存储身份证,身份证正好是18位的。但是在根据身份证号来查询用户的时候,忘了给这个查询条件的身份证号加上’"",然后就产生了问题。

先来看sql语句:

select * from kaoshi_user where sfzh=330382199602254675

这条sql语句 本来以为只会查出 身份证号是330382199602254675的用户,没想到查询结果如下图:

Mysql--对varchar字段用int数值来查询的问题_第1张图片

但是把sql语句修改一下,在身份证号那个条件语句用字符串来查询,而不是整数,如:

select * from kaoshi_user where sfzh='330382199602254675'

查出来的结果那就只有这一条了。


明显上述sql语句在条件加单引号是符合我的要求的。但是不明白为什么用整数数值来查询会出现问题,在网上查询资料发现关于这方面的资料也很少。


后来在查询了官方文档后(MySql官方文档表达式中隐式类型转换),知道了结果。

得出的结论如下:

1.在字符串和数值作比较的时候,字符串和数值都会转换成浮点数进行比较。
2.字符串在转浮点数时,如果字符串开头是数字,那就一直截取,直到截取到的不是数字是其他字符为止。若开头不是数字,那么转换数值类型的结果就直接取0。(如’123abc’转成的值是123,'ab123’取到的值是0)
3.在上述中,我的字符串存储的是18位varchar类型。由于在转换成浮点数的时候,数值太大会自动转换成科学计数法,而且浮点数的精度不准确,都是取近似值,所以会出现意外的内容。也就是说我的查询sql条件在用数值类型时,由于数值太大了,所以在转换成浮点数的时候变成了科学计数法,同理被查询的字段也被转换成了浮点数的科学计数法,又由于浮点数精度的不准确,导致查询结果出现不准确。
4.如果用了字符串字段,在查询的时候最好不要用数值(如整数之类的)来查询,因为如果用数值查询,也就是如上面说的,MySql会自动把表达式中的值都转换成浮点数。而这里索引字段varchar类型进行自动转换成了浮点数,导致了索引失效。
 

你可能感兴趣的:(mysql,数据库)