当前位置: 首页 > news >正文

MySQL的隐式转换

隐式转换

若字符串是以数字开头,并且全部都是数字,则转换的数字结果是整个字符串;部分是数字,则转换的数字结果是截止到第一个不是数字的字符为止
若字符串不是以数字开头,则转换的数字结果是 0

varchar str = "123dafa" // 转换为数字是 123
SELECT '123dafa' + 1; // 124
varchar str = "aabb33" // 转换为数字是 0
SELECT 'aabb33' + 100; // 100
SELECT 1 + '1'; // 2
SELECT CONCAT(2, ' test'); // '2 test'

看一下官方的隐试转换说明:

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

为什么触发隐式类型转换,查询数据时就需要全表扫描?

对于 InnoDB 的 B+树索引结构,相信大多数小伙伴都有一定的了解。
示例有下面一组数据:

1, 2, 3, 4, 6, 6, 7, 11, 13, 21, 23, 39, 42, 61, 71, 
101, 201, 220, 303, 345, 411, 601, 620, 701, 1402, 3333

在这里插入图片描述
当作为字符串类型建立索引时,数据顺序和B+树索引结构如下:

1, 101, 11, 13, 1402, 2, 201, 21, 220, 23, 3, 303, 3333, 
345, 39, 4, 411, 42, 6, 6, 601, 61, 620, 7, 701, 71

在这里插入图片描述
实际上,B+ 树索引的快速定位能力,来源于同一层兄弟节点的有序性。对索引字段做函数操作,可能会破坏索引值的有序性。
而当字符串和数字做比较时,会将字符串转换成数字。

总结

MySQL查询中,当字符串和数字做比较时,会触发隐式类型转换,转换规则是将字符串转换成数字。

  • 当索引字段是字符串类型,输入参数是数值类型时,会将字段转换成数值类型再进行查找,也就是对索引字段做了函数操作,破坏了索引的有序性,因此无法使用索引。
  • 当索引字段是数值类型,输参数是字符串类型时,会将输入参数转换成数值类型再进行查找,对等号后面的输入参数进行函数操作,并不影响索引字段的有序性,因此可以使用索引。
http://www.lryc.cn/news/68609.html

相关文章:

  • LeetCode:23. 合并 K 个升序链表
  • js:正则表达式常用方法总结test、exec、match、matchAll、replace、replaceAll、search
  • 分析车载蓝牙通话只有前喇叭声音,后面喇叭无声背后原因
  • 高性能ADC/DAC FMC子卡推出-FMC164
  • Agisoft Metashape 红外影像处理
  • Mybatis从入门到入土
  • 修为 - 人生感悟
  • UnityWebSocket | 双端通信支持Text/Binary
  • lazada详情
  • 企业为什么要数字化转型?
  • Excel 设置只能输入指定的字符
  • Web开发介绍
  • 多语言APP的外包开发流程及注意事项
  • CMAKE介绍和使用(Windows平台)
  • 宝塔面板webhook 使用教程
  • 大模型时代入场级技能:提示词工程!中文教程来啦
  • template和component自定义组件之间的区别
  • 如何提高读取Excel的效率,NPOI多线程读取详解
  • 【算法】【算法杂谈】从1到n的自然数组中,1出现的次数如何计算?
  • 日常笔记-Flutter build命令参数
  • 【利用AI让知识体系化】入门Koa框架
  • 边缘计算:数据采集、清洗与处理的新时代
  • 分区计量管理项目应用
  • LayoutInflater中inflate()参数解析
  • 星河案例ㅣ中国电信 X 冲量在线:基于智算中心的隐私计算应用实践
  • 开发笔记之:JAVA读取QT QDataStream输出
  • Docker入门实战---修改Docker镜像源
  • Java构建高并发高可用的电商平台(静态架构蓝图之剖析架构)
  • SpringBoot核心运行原理解析之------@Conditional条件注解
  • systemverilog 001 内建数据类型logic