MySQL中什么情况下类型转换会导致索引失效

文章目录

  • 1. 问题引入
  • 2. 准备工作
  • 3. 案例分析
    • 3.1 正常情况
    • 3.2 发生了隐式类型转换的情况
  • 4. MySQL隐式类型转换的规则
    • 4.1 案例引入
    • 4.2 MySQL 中隐式类型转换的规则
    • 4.3 验证 MySQL 隐式类型转换的规则
  • 5. 总结

如果对 MySQL 索引不了解,可以看一下我的另一篇博文: MySQL-进阶篇-索引(索引概述、索引的结构、索引的分类、索引的语法、性能分析工具、索引的使用规则、索引的设计原则)

1. 问题引入

我们知道,在 MySQL 中,如果发生了隐式类型转换,有可能会导致索引失效,那什么情况下隐式类型转换会导致索引失效呢

2. 准备工作

我们创建一张名为 test 的表,探究什么情况下隐式类型转换会导致索引失效

  • a 字段是 int 类型,b 字段是 varchar 类型
  • a 字段和 b 字段都建立了索引

在这里插入图片描述

DROP TABLE IF EXISTS `test`;CREATE TABLE `test`
(`a` int                                                           NULL DEFAULT NULL,`b` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,INDEX `inx_a` (`a` ASC) USING BTREE,INDEX `idx_b` (`b` ASC) USING BTREE
) ENGINE = InnoDBCHARACTER SET = utf8mb4COLLATE = utf8mb4_0900_ai_ciROW_FORMAT = Dynamic;

3. 案例分析

3.1 正常情况

我们先来看正常的情况下,也就是没有发生隐式类型转换的情况下,索引是否生效

explain
select *
from test
where a = 1;explain
select *
from test
where b = '1';

第一条 SQL 语句的执行结果

在这里插入图片描述

第二条 SQL 语句的执行结果

在这里插入图片描述

可以看到,正常情况下 idx_a 索引和 idx_b 索引都生效了

3.2 发生了隐式类型转换的情况

接下来我们看一下发生了隐式类型转换的情况下索引是否生效

explain
select *
from test
where a = '1';explain
select *
from test
where b = 1;

第一条 SQL 语句的执行结果

在这里插入图片描述

第二条 SQL 语句的执行结果

在这里插入图片描述

可以看到,第一条 SQL 语句走了索引,但是第二条 SQL 语句却没有走索引

为什么呢,同样是发生了隐式类型转换,为什么 a 字段对应的索引生效了,但是 b 字段对应的索引却失效了

要解答这个问题,我们需要知道 MySQL 隐式类型转换的规则

4. MySQL隐式类型转换的规则

4.1 案例引入

我们通过几个例子来理解 MySQL 隐式类型转换的规则

在这里插入图片描述

select 1 = 'a';select 0 = 'a';select 2 = '2';select 0 = '聂可以';select 1 = '+1';select -1 = '-1';select 10 = '+10a';select 10 = '10a';select 1 = 'a1';select 10 = '1a0';

以上 select 语句的输出结果(结果返回 1 表示条件成立,返回 0 表示条件不成立)

在这里插入图片描述

select 1 = 'a'; # 返回0select 0 = 'a'; # 返回1select 2 = '2'; # 返回1select 0 = '聂可以'; # 返回1select 1 = '+1'; # 返回1select -1 = '-1'; # 返回1select 10 = '+10a'; # 返回1select 10 = '10a'; # 返回1select 1 = 'a1'; # 返回0select 10 = '1a0'; # 返回0

以下几个 SQL 语句返回 1 不难理解,因为字符串转换为数字后确实与要比较的数字相等

  • select 2 = ‘2’; # 返回1

  • select 1 = ‘+1’; # 返回1

  • select -1 = ‘-1’; # 返回1

但是以下几个 SQL 语句的结果就有点费解了

  • select 0 = ‘聂可以’; # 返回1
  • select 10 = ‘10a’; # 返回1

4.2 MySQL 中隐式类型转换的规则

要搞明白上述几个例子,我们需要知道 MySQL 中隐式类型转换的规则,在 MySQL 中

  1. 当字符串转换为数值时,如果字符串是合法数字开头的,会尝试将字符串转换为数值类型,如果字符串是合法数字开头,但整个字符串又不是完全合法的数字,则只会转换字符串开头的合法数字部分
  2. 如果字符串不是以合法数字开头,那么转换结果为 0
  3. 发生类型转换时,绝大多数情况是从字符串转换为数值,而不是从数值转换为字符串,(只有极少数情况是从数值转换为字符串,例如使用 concat 函数将数值和字符串拼接成一个新的字符串时)
select 123 + '456';

在这里插入图片描述

select concat(123, '456');

在这里插入图片描述


知道 MySQL 中隐式类型转换的规则后,再次理解上述例子,就比较容易了

  • ‘a’ 是非数值类型的字符串,转换为数值后的值为 0
  • ‘聂可以’ 是非数值类型的字符串,转换为数值后的值为 0
  • ‘10a’ 字符串的前面部分合法,转换为数值后的值为 10
  • ‘1a0’ 字符串的前面部分合法,转换为数值后的值为 1(转换过程中如果遇到非法字符就会停止转换过程)

我们再次分析最初的例子

explain
select *
from test
where a = '1';explain
select *
from test
where b = 1;

a 字段是 int 类型, ‘1’ 是字符串类型,类型不匹配,发生隐式类型转换,也就是将字符串 ‘1’ 转换成数值,再与数值 1 比较,这个转换过程并没有破坏索引树的结构,索引会生效

b 字段是 varchar 类型, 1 是数值类型,类型不匹配,发生隐式类型转换,也就是将每一行记录中的 b 字段都转换为数值,再与数值 1 进行比较,这个转换过程破坏了索引树的结构,索引不会生效

4.3 验证 MySQL 隐式类型转换的规则

我们往表中插入两条数据

insert into test
values (1, 'NieKeYi');insert into test
values (2, '2024年10月13日');

执行以下 select 语句,验证 MySQL 隐式类型转换的规则


select *
from test
where b = 0;

查询结果如下

在这里插入图片描述


select *
from test
where b = 2024;

查询结果如下

在这里插入图片描述


select *
from test
where a = '2a';

查询结果如下

在这里插入图片描述

5. 总结

当数据库表的字段为 varchar 类型,而传入数据的类型为 int 时,会导致索引失效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTF(七)

导言: 本文主要讲述在CTF竞赛中,Misc(杂项)题目中的CatchCat。 靶场链接:攻防世界 (xctf.org.cn) 一,分析题目。 下载并解压附件: CatchCat.txt文件内容为: 发现是坐标。 另一个…

表贴式永磁同步电机无感控制-基于滑膜观测器SMO法

导读:在全速域范围内,一般的永磁同步电机无感控制要分为低速区域和高速区域两个部分。原因在于常规的方法是利用模型建立反电动势观测器来求解转子位置信息,但其只适合在中高速区域。本文介绍一种基于滑膜观测器SMO法+PLL的方法。 需要文章中的仿真,关注微信公众号:浅谈电…

python机器人编程——用python调用API控制wifi小车的实例程序

目录 一、前言二、一个客户端的简单实现2.1 首先定义一个类及属性2.2 其次定义连接方法2.3 定义一些回调函数2.4 定义发送小车指令方法2.5 定义一个正常关闭方法 三、python编程控制小车的demo实现四、小结PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源p…

【大数据技术基础 | 实验四】HDFS实验:读写HDFS文件

文章目录 一、实验目的二、实验要求三、实验原理(一)Java Classpath(二)Eclipse Hadoop插件 四、实验环境五、实验内容和步骤(一)配置master服务器classpath(二)使用master服务器编写…

JVM学习总结:字节码篇

本文是学习尚硅谷宋红康老师主讲的 尚硅谷JVM精讲与GC调优教程 的总结 ,部分内容也参考了 JavaGuide 网站(文末有链接) JVM 概述 Oracle JDK 与 OpenJDK 是什么关系? 2006 年 SUN 公司将 Java 开源,也就有了 OpenJDK。…

Games202作业5(完结)

单帧降噪 也就是针对图像空间进行降噪 也就是我们需要在像素(i,j)的四周进行采样,然后将采样的权重加到一起,然后所有的权重和像素的乘积也加到一起,然后相除,得到最终滤波后的(i,j)像素期望的结果。 Buf…

P4可编程技术详解:从理论到硬件实现

P4的诞生 为打破传统的固定封装模式,充分解放数据平面的编程能力,Nick McKeown领导的斯坦福大学研究团队于2014年提出可编程处理语言P4。借助P4的数据平面编程能力,用户可在网卡、交换机、路由器等网络设备上实现包括VXLAN、MPLS等在内的各种…

电影评论网站开发:Spring Boot技术指南

3系统分析 3.1可行性分析 通过对本电影评论网站实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本电影评论网站采用SSM框架,JAVA作为开发语言&#…

Linux文件的查找和打包以及压缩

文件的查找 文件查找的用处,在我们需要文件但却又不知道文件在哪里的时候 文件查找存在着三种类型的查找 1、which或whereis:查找命令的程序文件位置 2、locate:也是一种文件查找,但是基于数据库的查找 3、find:针…

基于SpringBoot+Vue+uniapp微信小程序的社区门诊管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

01 设计模式-创造型模式-工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,它提供了一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。 工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。 通过使用工厂模式…

1.2.3 TCP IP模型

TCP/IP模型(接网叔用) 网络接口层 网络层 传输层 应用层 理念:如果某些应用需要“数据格式转换”“会话管理功能”,就交给应用层的特定协议去实现 tip:数据 局部正确不等于全局正确 但是,数据的 全局正…

数码准备记录

1.数据结构 常见的数据结构包括数组、链表、栈、队列、树(如二叉树、B树、B树)、图等 2.队列和栈的区别 队列是一种先入先出的数据结构,即最先加入的元素被最先移除; 栈是一种后进后出的数据结构,即最后加入的元素…

RTMP协议分析

理论 总体介绍 RTMP协议是应⽤层协议,是要靠底层可靠的传输层协议(通常是TCP)来保证信息传输的可靠性的。在基于传输层协议的链接建⽴完成后,RTMP协议也要客户端和服务器通过“握⼿”来建⽴基于传输层链接之上的RTMP Connection链…

Collection 单列集合 List Set

集合概念 集合是一种特殊类 ,这些类可以存储任意类对象,并且长度可变, 这些集合类都位于java.util中,使用的话必须导包 按照存储结构可以分为两大类 单列集合 Collection 双列集合 Map 两种 区别如下 Collection 单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两…

Electron-(二)桌面应用的启动动画创建

一、概述 在很多桌面应用中都会有启动画面的显示。启动画面可以解决在启动时耗时较长,将每一步反馈给用户。另外一方面解决启动过程中的环境检查及检查结果的反馈。 在当今的桌面应用领域,启动动画已成为提升用户体验的重要组成部分。它不仅仅是一个简单…

【Linux】main函数的参数列表从何而来?

Linux系统进程通过exec系列函数启动新程序时,argc整型 、 argv数组 和 环境变量表 environ 会作为 exec 系列函数的参数,显式传递给新程序的 main 函数。 main函数的参数列表 在C语言中,main函数的标准参数列表通常如下所示: in…

极客wordpress模板

这是一个展示WordPress主题的网页设计。页面顶部有一个导航栏,包含多个选项,如“关于我们”、“产品中心”、“案例展示”、“新闻动态”、“联系我们”和“技术支持”。页面中间部分展示了多个产品,每个产品都有一个图片和简短的描述。页面下…

MySQL【知识改变命运】06

前言:在05这节数据结构里面,我们知道select * from 这个操作很危险,如果数据库很大,会把服务器资源耗尽,接下来提到的查询可以有效的限制返回记录 1:分页查询 分页查询可以有效控制一次查询出来的结果集的…

【CTF刷题9】2024.10.19

[MoeCTF 2021]babyRCE 考点&#xff1a;关键词过滤&#xff08;绕过方法参考往期博客&#xff09; 来源&#xff1a;nssctf <?php$rce $_GET[rce]; if (isset($rce)) {if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\|\%|\&g…