分析MySQL中隐式转换导致查询结果错误及索引不可用

以下是例子

1
SELECT * FROM TABLE WHERE xxx = 11

如果列xxx确实只有11的,你是否就认为筛选出来的就一定只有xxx=11的呢?

在过滤字段为数值类型的时候,数值类型有一种隐式转换,如果是以数字开头的,包含有字符,后面的字符会被截断,只取前面的数字值。

以下也均为测试数据

mysql数据转换图

当执行

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遇到字段类型不匹配的时候,会进行各种隐式转化

所以在查询过滤的时候,一定要注意过滤字段的类型。可能会导致查询慢,甚至会导致错误结果。

官方说是隐式转换

参考

分享到 评论