开始之前,先问个问题问题:mysql 数据类型是date ,怎么写查询条件索引有效?
——下面带着疑问看下去。

一、mysql-8.隐式转换导致索引失效或查出不符合where条件结果

今天在执行一条sql语句时候,where条件写错了,但是居然查询出来了结果。
如下图所示:
在这里插入图片描述
第一反映是,mysql的优化器是不是做了什么操作,导致最后查询条件不是现在的72071003dsss,而是变成了其它的值。因为之前在一篇文章看过,如果where条件两边一边是数值类型,一边是字符型mysql会做隐式转换,但是具体是怎么转换的,我就不是很了解。所以就先朝这个方向去查找结果。

首先去看下表结构,user_id字段果然是int类型,和查询条件72071003dsss不是同一个类型。

通过查询官方文档得到一个答案:(对于今天问题的探讨,重点请看最后一条)

当操作符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。某些转换是隐式发生的。

  • 如果一个或两个参数均为NULL,则比较的结果为NULL,但NULL-safe <=> 相等> 比较运算符除外。对于NULL <=> NULL,结果为true。无需转换。
  • 如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。
  • 如果两个参数都是整数,则将它们作为整数进行比较。
  • 如果不与数字比较,则将十六进制值视为二进制字符串。
  • 如果参数之一是a TIMESTAMP或 DATETIMEcolumn,而另一个参数是常量,则在执行比较之前,该常量将转换为时间戳。这样做是为了使ODBC更友好。对于的参数,此操作未完成 IN()。为了安全起见,在进行比较时请始终使用完整的日期时间,日期或时间字符串。例如,要在BETWEEN与日期或时间值一起使用时获得最佳结果 ,请使用CAST()将值显式转换为所需的数据类型。
  • 一个或多个表中的单行子查询不被视为常量。例如,如果子查询返回要与DATETIME 值进行比较的整数,则比较将作为两个整数进行。整数不转换为时间值。要将操作数作为DATETIME值进行比较 ,请使用 CAST()将子查询值显式转换为DATETIME。
  • 如果参数之一是十进制值,则比较取决于另一个参数。如果另一个参数是十进制或整数值,则将参数作为十进制值进行比较;如果另一个参数是浮点值,则将参数作为浮点值进行比较。

在所有其他情况下,将参数作为浮点数(实数)进行比较。例如,将字符串和数字操作数进行比较,将其作为浮点数的比较。

1.1 隐式转换导致查询出不符合where条件的结果

如果查询条件的由字符转为浮点时候,又是什么样的转换规则呢?

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

所以我们文章开始贴出来的sql:

SELECT * FROM A WHERE config_name='test111' AND user_id ='72071003dsss'

查询条件’72071003dsss’被转换成了72071003,那么最后的查询语句就是:

SELECT * FROM A WHERE config_name='test111' AND user_id ='72071003'

结果: 由于触发隐式转换,将我们的字符型查询条件按照一定规则转换成了浮点性,变成了另一个值,而刚好这另一个值有匹配的结果。这就是为什么查询出了不符合where条件的结果原因。

1.2 隐式转换导致索引失效

  • 当操作符左右两边的数据类型不一致时,会发生隐式转换。
  • 当where查询操作符左边为数值类型时发生了隐式转换,那么对效率影响不大,但还是不推荐这么做。

select* from test1 where int_column= ‘10000’
对于这条sql的 int_column字段是整型左边为int类型10000,转换为浮点数还是10000,右边字符串类型’10000’,转换为浮点数也是10000。两边的转换结果都是唯一确定的,所以不影响使用索引。

  • 当where查询操作符左边为字符类型时发生了隐式转换,那么会导致索引失效,造成全表扫描效率极低。

sselect* from test1 where str_column= 10000,

对于这条sql str_column是字符型左边是字符串类型’10000’,转浮点数为10000是唯一的,右边int类型10000转换结果也是唯一的。
但是,因为左边是检索条件,'10000’转到10000虽然是唯一,但是其他字符串也可以转换为10000,比如’10000a’,‘010000’,'10000’等等都能转为浮点数10000,这样的情况下,是不能用到索引的。

tips:隐式转换有可能会导致索引失效,这个我们工作中需要注意的。当where查询操作符左边为字符类型时发生了隐式转换,那么会导致索引失效,造成全表扫描效率极低。

上面便解答了文章开始最初的问题。接下来,我们来回到date类型的总结。

二、问题:mysql 数据类型是date ,怎么写查询条件索引有效?

2.1 走索引的方式:

  1. 直接范围比较:
WHERE date_column >= '2025-07-01' AND date_column <= '2025-07-31'

使用比较运算符(>=/<=)直接匹配DATE类型,数据类型一致,可触发索引‌。

2‌. BETWEEN操作符

WHERE date_column BETWEEN '2025-07-01' AND '2025-07-31'

功能等效于范围比较,同样支持索引优化‌。

  1. 精确日期匹配
WHERE date_column = '2025-07-29'

等值查询时,若数据类型完全匹配(DATE=DATE),可走索引‌。

2.2 不会走索引的写法

  1. 使用日期函数,这种显式转换
WHERE DATE(date_column) = '2025-07-29'WHERE MONTH(date_column)=7WHERE DATE_FORMAT(date_column, '%Y-%m')='2025-07'

函数转换会使索引失效,导致全表扫描‌

  1. 类型不一致的查询,这种隐式转换
WHERE date_column = 20250729INT vs DATE

数据类型不匹配时,有可能无法走索引。隐式转换不一定必然导致索引失效,看情况

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

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

相关文章

【sklearn(01)】数据集加载、划分,csv文件创建,特征工程,无量纲化

目录sklearn数据集玩具数据集现实世界数据集加载玩具数据集获取现实世界数据集本地csv数据创建csv文件pandas加载csv数据集划分特征工程步骤特征工程APIDictVectorizer 字典列表特征提取APICountVectorizer 文本特征提取API英文文本提取中文文本提取TfidfVectorizer TF-IDF文本…

docker desktop入门(docker桌面版)(提示wsl版本太低解决办法)

参考文章&#xff1a;Docker Desktop Engine Stopped原因分析&#xff08;docker桌面停止&#xff09;WSL没装或没更新 文章目录Docker Desktop入门指南1. Docker Desktop简介2. 安装Docker Desktop2.1 系统要求2.2 下载和安装3. 配置Docker Desktop修改默认存储路径4. 运行你的…

《n8n基础教学》第三节:模拟一个自动化场景

1、模拟场景Nathan &#x1f64b;是 ABCorp 的分析经理&#xff0c;他的工作是支持 ABCorp 团队的报告和分析。作为一个真正的多面手&#xff0c;他还负责处理一些杂项任务。Nathan 做的一些事情是重复且枯燥的。他希望自动化其中一些任务&#xff0c;以避免精疲力竭。作为一名…

CodeRush AI 助手进驻 Visual Studio:AiGen/AiFind 亮相(三)

CodeRush 是专为 Visual Studio 打造的高效开发插件&#xff0c;通过集成 AI 驱动功能&#xff08;如自然语言生成代码的 AiGen 和智能搜索逻辑的 AiFind&#xff09;、语音交互及深度重构工具&#xff0c;直接在 IDE 内无缝完成代码生成、修改与导航&#xff0c;消除窗口切换与…

如何从头开始搭建属于自己的家用nas实现内网穿透访问

最近我在家部署了群晖NAS923&#xff0c;从而实现内网穿透&#xff0c;下面写一个新手向教程&#xff1a; 一、硬件安装与初始化设置 1. 硬盘安装&#xff08;已完成可跳过&#xff09; 群晖 923 支持 4 块 3.5 英寸硬盘&#xff0c;开箱后取出硬盘架&#xff0c;将硬盘&am…

mysql 之多表

mysql之多表已知2张基本表&#xff1a;部门表&#xff1a;dept &#xff08;部门号&#xff0c;部门名称&#xff09;;员工表 emp&#xff08;员工号&#xff0c;员工姓名&#xff0c;年龄&#xff0c;入职时间&#xff0c;收入&#xff0c;部门号&#xff09;CREATE table dep…

【Django】-6- 登录用户身份鉴权

一、&#x1f6e1;️ Django 鉴权 & 登录控制 Django 自带的鉴权系统&#xff08;用户身份管理小管家&#xff09;鉴权系统能干啥&#xff1f;Django 自带的鉴权系统&#xff0c;就像一个 “用户身份管家” &#xff0c;帮你管好这些事儿&#xff1a;功能类比加密存储用户密…

winscp 连openwrt 返回127错误码

winscp 连openwrt 24.10返回127错误码。找了许多原因也没搞清为啥&#xff08;客户端加密方式、winscp版本过低等都试过&#xff09;&#xff0c;用SecureFx试了一下&#xff0c;发现是openwrt 24.10固件没有安装Sftp服器&#xff0c;用下列命令安装即可。opkg install openssh…

Python编程基础与实践:Python文件处理入门

Python文件处理实战 学习目标 通过本课程的学习&#xff0c;学员将掌握如何在Python中打开、读取、写入和关闭文件&#xff0c;了解文本文件和二进制文件的区别&#xff0c;以及在文件处理中的一些最佳实践。 相关知识点 Python文件处理 学习内容 1 Python文件处理 1.1 文件的基…

Corrosion2靶机

打开靶机信息收集&#xff1a;kali里使用arp-scan -l或者netdiscover发现主机使用nmap扫描端口nmap -sS -sV -T4 -n -p- 192.168.31.20开启了22、80、8080端口 8080发现开启了tomcat服务扫出了他的ip以及他开放的端口&#xff0c;我们接下来拿浏览器访问一下两个页面都没有什么…

编程与数学 03-002 计算机网络 18_物联网与网络

编程与数学 03-002 计算机网络 18_物联网与网络一、物联网的基本概念&#xff08;一&#xff09;物联网的架构与层次&#xff08;二&#xff09;物联网的关键技术二、物联网网络的构建&#xff08;一&#xff09;物联网网络的通信协议&#xff08;二&#xff09;物联网网络的拓…

【Kubernetes】ConfigMap配置管理:存储配置参数,创建到容器挂载

在Kubernetes中&#xff0c;配置管理是应用部署的重要环节。ConfigMap作为存储非敏感配置数据的资源对象&#xff0c;能帮助我们实现"配置与代码分离"&#xff0c;让应用部署更灵活。一、什么是ConfigMap&#xff1f; ConfigMap是Kubernetes中用于存储非加密配置数据…

Promise和回调地狱

顺序执行 vs. 异步操作&#xff1a; 当我们说“顺序执行”&#xff0c;通常是指 操作按顺序发生。而 异步操作 指的是操作在后台执行&#xff0c;不会阻塞其他操作&#xff0c;通常会使用回调、Promise 或 async/await 来处理结果。 在 Promise 链式调用 的情况下&#xff0c;虽…

LeetCode 65:有效数字

LeetCode 65&#xff1a;有效数字问题本质与挑战 需判断字符串是否为有效数字&#xff0c;规则涉及整数、小数、指数&#xff08;e/E&#xff09;的复杂组合&#xff0c;如&#xff1a; 整数&#xff1a;123、-45、678小数&#xff1a;1.2、.3、4.、5.6指数&#xff1a;1e10、2…

数据结构之顺序表应用与双指针法

元素删除通过元素移动的方式来模拟删除操作&#xff1a;将指定下标后的所有元素依次向前移动一位&#xff0c;覆盖要删除的元素&#xff0c;从而达到 "删除" 的效果。 通过自定义函数实现删除功能&#xff0c;需要传入数组、数组长度的指针&#xff08;因为要修改长度…

Python编程基础与实践:Python基础数据类型入门

Python变量与数据类型实践 学习目标 通过本课程的学习&#xff0c;学员可以掌握Python中变量的基本概念&#xff0c;了解并能够使用Python的基本数据类型&#xff0c;包括整型、浮点型、字符串和布尔值。此外&#xff0c;学员还将学习如何在实际编程中声明和使用这些数据类型。…

深入解析C/C++函数变量传递:栈、堆与全局变量的生命周期之旅

资料合集下载链接: ​https://pan.quark.cn/s/472bbdfcd014​ 在编程学习中,函数是构建程序的基石,而理解变量如何在函数之间正确、安全地传递,则是从入门到进阶的关键一步。我们经常会遇到这样的困惑:为什么一个指针在某个函数里工作正常,传递给另一个函数后却变成了“…

Ubuntu18网络连接不上也ping不通网络配置问题排查与解决方法

Ubuntu 18启动以后发现连接不上网络,执行 ip a命令或者ifconfig都显示不了正确的地址(192.168.xxx.xxx)。 刚装好系统是没问题的,打算使用FTP开启ftp服务与windows互传文件,安装了net-tools插件就突然连不上网络了,怀疑是网络配置被修改了。 经过了一段时间折腾终于解决了,…

【计算机网络】Socket网络编程

目录 一、主机字节序列和网络字节序列 二、套接字地址结构 1、IPv4 地址结构 (sockaddr_in) 2、IPv6 地址结构 (sockaddr_in6) 3、通用套接字地址结构 (sockaddr) 4、Unix域套接字地址结构 (sockaddr_un) 5、专用 socket 地址结构 6、套接字地址结构的转换 字符串转二进制地址 …

网页操作自动化解决方案:如何用Browser-Use+CPolar提升企业运营效率

文章目录前言1. 安装Ollama2. Gemma3模型安装与运行3. 虚拟环境准备3.1 安装Python3.2. 安装conda4. 本地部署Brower Use WebUI4.1 创建一个新conda环境4.2 克隆存储库4.3 安装依赖环境4.4 安装浏览器自动化工具4.5 修改配置信息5. 本地运行测试6. 安装内网穿透6.1 配置公网地址…