mysql varchar和bigint比较的坑
问题描述:
做两表关联时,有个比较,bigint和varchar 结果报错’Data truncation: Truncated incorrect DOUBLE value’,大多数问题出现是制表时不规范,类型没有统一,或者是子表查询出来的字段会默认是varchar;还有就是在查询时会出现精度负优化,搞得找问题是各种迷。在插入语句中出现,会有这个类型报错提示,查询时就没有,直接通过!
大致就是:
select 165933842860300000003 = '165933842860300000004'; 这个sql返回的结果就是1,认为条件成立,这个查询出来就会出现各种奇葩的问题```
如:
而select 165933842860300000003 = 165933842860300000004;返回的结果就是0,条件不成立
这个是mysql做的兼容性的操作
MySQL在比较字符串和数值时,会将两者都转换成双精度浮点数进行比较,因为精度丢失,导致比较结果为true
详细介绍:
出现上面问题的原因是:在MySQL中当我们对不同类型的值进行比较的时候,为了使得这些数值可比较(也可以称为类型的兼容性),MySQL
会做一些隐式转换(Implicit type conversion) //
MySQL官方文档中有一篇介绍关于比较函数与运算符的文档。其中写到, Strings are automatically converted
to numbers and numbers to strings as necessary. 意思是必要时字符串和数字之间会互相转换。
// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html
解决方案:
1、统一字段类型,用bigint就都用bigint,用varchar都用varchar。这样不仅规范,而且可以避免两表联查时索引失效;
2、查询语句的条件中严格按照字段的类型写查询值。避免mysql进行隐式转换。也同时可以避免索引失效;
3、统一查询比较时的类型,使用mysql提供的CAST()函数,或者各种字符串函数处理。
补充另一个类似的问题,日常开发中遇到了,记录下:
如果字段的排序规则是utf8_general_ci 或 utf8mb4_general_ci,是不区分大小写的排序规则,
select ‘4507890a’ = ‘4507890A’ 是true;
使用 COLLATE 关键字临时改变字符串比较的排序规则可以正常查询:select ‘4507890a’ COLLATE utf8_bin = ‘4507890A’ COLLATE utf8_bin ;
更多推荐
所有评论(0)