作家
登录

MySQL数据类型隐式转换规则

作者: 来源: 2017-12-20 16:04:49 阅读 我要评论

  • 定义表的时刻,areacode字段是字符串类型的,萌芽的时刻传入的是0001,这里0001被Mysql当做了整数处理为1,Mysql检测到areacode这个字段的萌芽类型是整型,就会全表扫描,将所有行的areacode转换成整型,然后在做萌芽处理。

    找原因了,就很好解决了,膳绫擎的sql语句修改如下:

    1. mysql> explain select * from convert_test where areacode='0001' and period>='20170511' and period<='20170511'

    结不雅如下:

    可以看到完全射中了idx_areacode_period 这个索引。

    扩大

    所有其他情况下,两个参数都邑被转换为浮点数再进行比较

  • 乍一看,明明创建了一个独一索引,正常来说,膳绫擎的萌芽语句应当正好射中idx_areacode_period这个索引的,不该该是慢萌芽的。

    膳绫擎的period定义的时刻是整型,然则萌芽传入的是字符串类型,那为什么会射中索引的呢?

    看一下官方的隐试转换解释:

    1. 两个参数至少有一个是 NULL 时,比较的结不雅也是 NULL,例外是应用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不须要做类型转换

    2. 两个参数都是字符串,会按照字符串来比较,不做类型转换

    3. 两个参数都是整数,按照整数来比较,不做类型转换

    4. 十六进制的值和非数字做比较时,会被当做二进制串

    5. 有一个参数是 decimal 类型,如不雅别的一个参数是 decimal 或者整数,会将整数转换为 decimal 落后行比较,如不雅别的一个参数是浮点数,则会把 decimal 转换为浮点数进行比较

    6. 所以,下面的几个sql语句有雷同的效不雅:

      1. select * from convert_test where areacode=0001 and period>='20170511' and period<='20170511'
      2. select * from convert_test where areacode=1 and period>='20170511' and period<='20170511'
      3. select * from convert_test where areacode=0001.0 and period>='20170511' and period<='20170511'
      4. select * from convert_test where areacode=1.0 and period>='20170511' and period<='20170511'

      mysql 在萌芽的时刻,会将areacode转换成浮点型进行比较

      【编辑推荐】

      1. 这五大年夜开源MySQL治理对象,将DBA大年夜 “删库跑路”中 解救出来!
      2. 数据库的优化,要大年夜这几方面着手!
      3. 记一次MySQL逝世锁排查过程
      4. 一篇文┞仿读懂阿里企业级数据库最佳实践
      5. 【MYSQL】营业上碰着的SQL问题整顿集合
      【义务编辑:庞桂玉 TEL:(010)68476606】

        推荐阅读

        【MYSQL】业务上碰到的SQL问题整理集合

      【限时免费】岁尾最强一次云计算大年夜会,看传统、社区、互联网企业若何碰撞? 身为一名前端工程师, 对于 SQL懂得程度并不是很深刻, 盘点一些小我工作碰到的问题,给大年夜家普及下常识, >>>详细阅读


      本文标题:MySQL数据类型隐式转换规则

      地址:http://www.17bianji.com/lsqh/39991.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)