mysql隐式转换会造成索引失效的原因

article/2025/7/14 23:57:57

现在我们看一个例子

比如现在我有一张表叫做test

涉及的字段有id  code  name  age  address

id 是int数值类型

code 是varchar字符串类型

name 是varchar字符串类型

age是int 数值类型

address是varchar 字符串类型

创建语句:

CREATE TABLE test (

id INT PRIMARY KEY,

code VARCHAR(255),

name VARCHAR(255),

age INT,

address VARCHAR(255) );

id是主键索引,这个就不必多说了,现在我们给code也建立一个普通索引,后续就是根据这个索引来阐述隐式转化导致索引失效的问题

创建索引语句

CREATE INDEX idx_code ON test (code);

idcodenameageaddress
1111zs张三28广东汕头
2111ls李四29广东揭阳
3111ww王五29广东潮州

现在我执行一条语句:

select * from test where code = 111;

大家觉得这条语句会有什么结果呢?

code是一个字符串类型,但是查询的值是一个数值类型,那么现在查询的结果是

张三李四王五都会被查出来,这是为什么呢?

其实这就是Mysql的隐式转化造成的结果

当查询的字段与等号的值的类型不一致时,Mysql则会根据需要自动进行隐式转化,那么到底是如何一种隐式转化呢?我们看这7点,

第一点不满足,我们没有为null;

第二点不满足,一个是code是字符串类型,等号右边的值是数值类型;

第三点不满足,一个是code是字符串类型,等号右边的值是数值类型;

第四点不满足,第五点不满足,第六点不满足;

第七点满足,所以会转化会共同转化为浮点类型。

code = 111,将code字符串类型转化为浮点类型,那么转化为浮点类型也是有一定说法的:

  • 不以数字开头的字符串都将转换为0。如'xxx''xx123dd''dd1222'都会转化为0
  • 以数字开头的字符串转换时会进行截取,从第一个字符截取到第一个非数字内容为止。比如'123abc'会转换为123'012abc'会转换为012也就是12'5.3a66b78c'会转换为5.3,其他同理。 

 那我们看这个转化规则,也就是数据表里面的code字符串能转化为111浮点的有3行记录

也就是张三、李四、王五的code分别是111zs,111ls,111ww

这就是隐式转化带来的问题。

我们用explain执行计划,看看此时code索引是否失效了。

那我们来看看如果我们正常的select,看看结果

select * from test where code = '111zs';

发现查询出来的结果就是张三一个人

看到结果,确实是失效了,走了全表扫描。rows也是3。

好,现在我们换一个方向 ,就是重新新建一个字段叫做score,分数,然后类型是int类型,同时也为它创建索引

CREATE INDEX idx_score ON test (score);

我们再查询的时候,等号右边的值用字符串

ALTER TABLE test
ADD COLUMN score INT AFTER age;

执行语句:

-- 更新张三的分数
UPDATE test SET score = 88 WHERE name = '张三';-- 更新李四的分数
UPDATE test SET score = 89 WHERE name = '李四';-- 更新王五的分数
UPDATE test SET score = 80 WHERE name = '王五';

执行这条语句: SELECT * FROM test WHERE score = '88'

查询返回结果:

这也是一种隐式转化,我们看看前面那7点,还是第7点会满足,等号右边的值‘88’还是转化为88,左边数据库里面的score本身就是int类型,所以匹配的结果还是1.

所以这种就不会索引失效。

总结:

        Mysql在对查询条件类型不匹配的时候,会进行隐式转换

        如果本身字段是字符串类型,等号右边的值却是一个数值类型,那么会造成索引失效,因为字符串转化为浮点类型的时候,对非数字开头的会进行截取,同样也可以满足条件。

        如果本身字段是数值类型,等号右边的值却是一个字符串类型,那么不会造成索引失效。


http://www.hkcw.cn/article/kEPHdgCnVM.shtml

相关文章

鲲鹏Arm+麒麟V10,国产化信创 K8s 离线部署保姆级教程

Rainbond V6 国产化部署教程,针对鲲鹏 CPU 麒麟 V10 的离线环境,手把手教你从环境准备到应用上线,所有依赖包提前打包好,步骤写成傻瓜式操作指南。别说技术团队了,照着文档一步步来,让你领导来都能独立完成…

Python训练营---Day40

知识点回顾: 彩色和灰度图片测试和训练的规范写法:封装在函数中展平操作:除第一个维度batchsize外全部展平dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭dropout 作业:仔细学习下测试和训练代码…

LeetCode 高频 SQL 50 题(基础版)之 【连接】部分 · 下

前五道题&#xff1a;LeetCode 高频 SQL 50 题&#xff08;基础版&#xff09;之 【连接】部分 上 题目&#xff1a;577. 员工奖金 题解&#xff1a; select r.name,b.bonus from Employee r left join Bonus b on r.empIdb.empId where b.bonus <1000 or b.bonus is nul…

C++八股 —— 手撕线程池

文章目录 一、背景二、线程池实现1. 任务队列和工作线程2. 构造和析构函数3. 添加任务函数4. 完整代码 三、阻塞队列实现1. 基础队列2. 升级版队列 四、测试代码五、相关问题六、其他实现方式 来自&#xff1a;华为C一面&#xff1a;手撕线程池_哔哩哔哩_bilibili 华为海思&am…

半导体厂房设计建造流程、方案和技术要点-江苏泊苏系统集成有限公司

半导体厂房设计建造流程、方案和技术要点-江苏泊苏系统集成有限公司 半导体厂房的设计建造是一项高度复杂、专业性极强的系统工程&#xff0c;涉及洁净室、微振动控制、电磁屏蔽、特殊气体/化学品管理等关键技术。 一、设计建造流程&#xff1a; 1.需求定义与可行性分析 &a…

gitLab 切换中文模式

点击【头像】--选择settings 选择【language】,选择中文&#xff0c;点击【保存】即可。

Redis 常用数据结构详解与实战应用

在当今互联网高速发展的时代&#xff0c;数据的存储和处理效率至关重要。Redis 作为一款高性能的内存数据库&#xff0c;凭借其丰富的数据结构和出色的性能&#xff0c;成为了众多开发者的首选。本文将深入探讨 Redis 常用的数据结构&#xff0c;并结合实际应用场景&#xff0c…

leetcode2221. 数组的三角和-medium

1 题目&#xff1a;数组的三角和 官方标定难度&#xff1a;中 给你一个下标从 0 开始的整数数组 nums &#xff0c;其中 nums[i] 是 0 到 9 之间&#xff08;两者都包含&#xff09;的一个数字。 nums 的 三角和 是执行以下操作以后最后剩下元素的值&#xff1a; nums 初始…

PPIO × AstrBot:多平台接入聊天机器人,开启高效协同 | 教程

在消息平台接入专属聊天机器人&#xff0c;能快速生成精准答案&#xff0c;与项目管理、CRM等系统集成后&#xff0c;机器人还能根据任务进展自动建群、推送进度提醒&#xff0c;并精准相关人员&#xff0c;实现信息的高效传递。 AstrBot 是一个多平台聊天机器人及开发框架&…

江科大SPI串行外设接口hal库实现

hal库相关函数 初始化结构体 typedef struct {uint32_t Mode; /*SPI模式*/uint32_t Direction; /*SPI方向*/uint32_t DataSize; /*数据大小*/uint32_t CLKPolarity; /*时钟默认极性控制CPOL*/uint32_t CLKPhase; /*…

【笔记】Suna 部署之获取 OpenAI API key

#工作记录 API Platform | OpenAI 一、注册或登录 OpenAI 账号 访问 OpenAI 官方网站&#xff08;platform.openai.com &#xff09;。若已有 ChatGPT 账号&#xff0c;可直接使用该账号登录。若无账号&#xff0c;点击注册&#xff08;Sign Up&#xff09;&#xff0c;填写有…

Java八股文——Java基础「概念篇」

参考小林Coding和Java Guide 说一下Java的特点 平台无关性&#xff1a;“Write Once, Run Anywhere”其最大的特点之一。Java编译器将源代码编译成字节码&#xff0c;该字节码可以在任何安装了JVM的系统上运行。面向对象&#xff1a;Java是一门严格的面向对象编程语言&#xf…

NHANES指标推荐:CQI

文章题目&#xff1a;The impact of carbohydrate quality index on menopausal symptoms and quality of life in postmenopausal women 中文标题&#xff1a;碳水化合物质量指数对绝经后妇女更年期症状和生活质量的影响 发表杂志&#xff1a;BMC Womens Health 影响因子&…

91.评论日记

2025年5月30日20:27:06 AI画减速器图纸&#xff1f; 呜呜为什么读到机械博士毕业了才有啊 | 新迪数字2025新品发布会 | AI工业软件 | 三维CAD | 国产自主_哔哩哔哩_bilibili

循环神经网络(RNN)全面教程:从原理到实践

循环神经网络(RNN)全面教程&#xff1a;从原理到实践 引言 循环神经网络(Recurrent Neural Network, RNN)是处理序列数据的经典神经网络架构&#xff0c;在自然语言处理、语音识别、时间序列预测等领域有着广泛应用。本文将系统介绍RNN的核心概念、常见变体、实现方法以及实际…

OrCAD X Capture CIS 设计小诀窍第二季 | 10. 如何自动将 270° 放置的网络名称修正为 90°

背景介绍&#xff1a;我们在进行原理图设计时&#xff0c;经常需要统一原理图的格式&#xff0c;从而保证原理图的美观和统一。而通过把所有270放置的网络名称修正为90可以避免因网络名称放置的方向不一致而造成混淆&#xff0c;比如6和9。但如果依靠设计师手动进行修改&#x…

核心机制:确认应答和超时重传

核心机制一:确认应答 实现让发送方知道接受方是否收到数据 发送方发送了数据之后,接受方,一旦接收到了,就会给发送方返回一个"应答报文"告诉发送方"我已经收到了数据" 网络上会出现"后发先至"的情况 为了解决上述问题,就引入了"序号和确…

特朗普:仍希望有国际学生在美国学习

当地时间5月30日,美国总统特朗普在白宫表示,仍希望有国际学生在美国学习。据美国政治新闻网站“Politico”27日的报道,特朗普政府已暂停新的学生签证面谈,同时考虑扩大对国际学生社交媒体审查范围。此外,据路透社30日援引一份美国国务卿发送给所有美国外交和领事馆的电报称…

两阶段uplift建模(因果估计+预算分配)的讲座与自己动手实践(一)

来自分享嘉宾在datafun论坛的分享&#xff0c;孙泽旭 中国人民大学高瓴人工智能学院 博士生分享的【面向在线营销场景的高效 Uplift 方法】 听讲座听的云里雾里&#xff0c;自己做点力所能及的小实践… 关于uplift笔者之前的博客&#xff1a; 因果推断笔记——uplift建模、met…

2025年通用 Linux 服务器操作系统该如何选择?

2025年通用 Linux 服务器操作系统该如何选择&#xff1f; 服务器操作系统的选择对一个企业IT和云服务影响很大&#xff0c;主推的操作系统在后期更换的成本很高&#xff0c;而且也有很大的迁移风险&#xff0c;所以企业在选择服务器操作系统时要尤为重视。 之前最流行的服务器…