分析MySQL中隐式转换导致查询结果错误及索引不可用
以下是例子
1 | SELECT * FROM TABLE WHERE xxx = 11 |
如果列xxx确实只有11的,你是否就认为筛选出来的就一定只有xxx=11的呢?
在过滤字段为数值类型的时候,数值类型有一种隐式转换,如果是以数字开头的,包含有字符,后面的字符会被截断,只取前面的数字值。
以下也均为测试数据
当执行
1 | explain select * from business_flow where business_flow_id = 268805964457574426 |
看输出会出现这段话
Cannot use ref access on index ‘xxx’ due to type or collation conversion on field ‘business_flow_id’
当过滤的字段是字符类型的时候,没有使用到索引,走的全表扫描;
所以还是可以查询出结果来的,因为无法使用索引,所以查询出来的结果也是错的。
既然发现查询出来的结果是有误差的,所以猜测用字符串’xxx’和xxy比较应该是相等的。
1 | select '268805964457574426' =268805964457574421 |
果不其然,也能查询出
去查询了下其他的
过滤字段为浮点类型,也会比较近似的,将导致结果看起来不一致,也就是可能导致查询结果错误
当MySQL遇到字段类型不匹配的时候,会进行各种隐式转化
所以在查询过滤的时候,一定要注意过滤字段的类型。可能会导致查询慢,甚至会导致错误结果。
官方说是隐式转换
分析MySQL中隐式转换导致查询结果错误及索引不可用
https://www.liangyouze.com/2019/10/11/分析MySQL中隐式转换导致查询结果错误及索引不可用/