Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的解决方法

发布时间:2020-12-08 09:50:45 作者:小新
来源:亿速云 阅读:303

这篇文章主要介绍了Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的解决方法,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。

背景

下面我们来看一下执行的结果

Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的解决方法

在上面的描述中我们还得注意就是,你的where条件的字符串不加单引号必须是全数字。不然就会报错

Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的解决方法

还有可能查出来的数据不是我们想要的数据。如下图

Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的解决方法

分析

  1. 从执行结果来看,使用了单引号的走了对应的索引。没有使用单引号的没有走索引,进行了全表扫描。
  2. 为什么会这样呢? mysql的优化器怎么不直接进行类型转换呢?

如上图所述:

1054 - Unknown column '000w1993521' in 'where clause', Time: 0.008000s

我们先来看一下一条SQL的执行过程

Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的解决方法

(网图)

隐式转换

1. 产生条件
当操作符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。则会发生转换隐式
发生隐式转换的条件:

  1. 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换
  2. 两个参数都是字符串,会按照字符串来比较,不做类型转换
  3. 两个参数都是整数,按照整数来比较,不做类型转换
  4. 十六进制的值和非数字做比较时,会被当做二进制串
  5. 有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp
  6. 有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较
  7. 所有其他情况下,两个参数都会被转换为浮点数再进行比较

2. 分析实际遇到的情况

1.那我们也就清楚了,上面我提出的例子是整数和字符串的比较,那就属于其他情况了。那我们就先来分析一下索引失效的原因

2.查询出不匹配的值(或者说是部分匹配的值),如上面的查询结果。这真得看看源码了,这也就是MYsql的隐式转换规则。这里不就细分析了(因为没有查到相关的文档)
由于历史原因,需要兼容旧的设计,可以使用 MySQL 的类型转换函数 cast 和 convert,来明确的进行转换。
总结

感谢你能够认真阅读完这篇文章,希望小编分享Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的解决方法内容对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,遇到问题就找亿速云,详细的解决方法等着你来学习!

推荐阅读:
  1. MySQL有哪些常见的规范
  2. MySQL数据库命令规范讲义

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql 5.6 准确 5.6

上一篇:html中设置字体大小的方法

下一篇:Python如何爬取Json数据

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》