MySQL中varchar和int隐式转换的注意事项!

一、前言

在一个阳光明媚的下午,我们的测试在运行SQL是发现了一个灵异事件。
别着急,等我慢慢说来,是一个查询库存的SQL,控制台打印了,查询为0条记录。
想着不太信,自己把SQL粘出来执行一下,刚好有个varchar类型的字段,查询的是一堆数字,忘记加引号了。
结果查询出来了一条!

两脸懵逼!

从头看到结尾,发现我们查询条件的字段值为231120103,把数据库中231120103-1的查询出来了!

经过半天的探索,发现这是MySQL优化器中,判断数据类型不匹配的比较时,MySQL 优化器会进行隐式类型转换!

下面我们一起来看看这个隐式转换,到底是怎么转换的!

要知其然,知其所以然。

二、实践出真知

1. 建表

CREATE TABLE `str_test`  (`id` int(0) NOT NULL,`str_column` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`int_column` int(0) NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

我们新建一个表,里面有varchar和int类型,插入几条方便测试!

INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (1, '123', 123);
INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (2, '123-1---1122', 12);
INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (3, 'abc', 1);
INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (4, '783221667772672728', 2147483647);
INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (5, '783221667772672798', 2147483647);
INSERT INTO `test`.`str_test`(`id`, `str_column`, `int_column`) VALUES (6, '0', 0);

在这里插入图片描述

2. 测试查询

我们先以int类型查询varchar作为测试:

SELECT * FROM `str_test` WHERE str_column = 123;

大家是不是认为这里只能查询出一条数据,答案是错误的!我们后面统一说结论,这里先看测试!

在这里插入图片描述

我们在插入一条str_column位数超过18位的!让转化是丢失精度,从而实现多查的情况!

我们看到查询的和被查询出来的是不一样的!

在这里插入图片描述

我们在以varchar来查询int字段:

SELECT * FROM `str_test` WHERE int_column = '12A333';

还是可以查询到数据!

在这里插入图片描述

3. 结论

经过上面的测试是不是已经汗流浃背了!不要慌,下面我们来揭晓答案!

有兴趣的可以看看官网文档:MySQL5.7文档

当整数与字符串进行比较时,无论数据库是int还是varchar,只要类型不一致时,MySQL会尝试将字符串转换为整数进行比较。
如果字符串以有效的数字开头,则将其转换为相应的整数值。
解析规则:从开头解析直到遇到非数字的字符结束,前面的会作为比较的值,非数字后面的直接抛弃。
如果字符串以非数字字符开头,将被转化为0。
数值过大时,回传精度损失,也会出现匹配。没找到具体的临界值,超过18位会出现浮点数精度损失!

三、隐式转换的缺点

精度损失: 隐式转换可能导致精度损失问题,上面我们演示过了。

性能开销: 在进行大规模数据处理时,频繁的隐式转换可能会对性能产生影响。

索引失效:存在隐式转换会让优化器无法使用索引进行优化查询,影响响应时间。

数据安全风险:如果是一个删除语句,像上面演示的会出现匹配到其他行,从而导致数据被误删。还有多查的问题。

四、总结

当然这个其实也是一个面试题,大家是不是已经会了!

之前在MySQL索引失效时,就了解过隐式转换,只知道会转换,今天才有了更深刻的认识。

其实这个情况我们还是要避免的,不能是MySQL不给我们报错,我们就这样不规范的写。

这要是生产上,一个删除匹配到多条,和删库跑路性质一样了!

大家还是要小心哈,一定不要出现隐式转换!

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

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

相关文章

【美团大数据面试】Java面试题附答案

目录 1.多线程代码示例 2.单例代码示例 3.LinkedBlockingQueue原理解析 4.模板设计模式讲解 5.生产者-消费者队列设计方法 6.堆内存和栈内存的区别 7.ThreadLocal底层机制 8.synchronized原理,存在的问题,解决方案 9.volatile使用场景和原理&am…

解析动态规划

本文由 简悦 SimpRead 转码, 原文地址 juejin.cn 前言 我们刷 leetcode 的时候,经常会遇到动态规划类型题目。动态规划问题非常非常经典,也很有技巧性,一般大厂都非常喜欢问。今天跟大家一起来学习动态规划的套路,文章…

突破PHP disable_functions方法

1. 利用 LD_PRELOAD 环境变量 知识扫盲 LD_PRELOAD:是Linux系统的一个环境变量,它指定的*.so文件会在程序本身的*.so文件之前被加载。putenv():PHP函数,可以设置环境变量mail(),error_log():PHP函数&…

Tekton

一. 概念 Tekton 官网 Github Tekton 是一种用于构建 CI/CD 管道的云原生解决方案,它由提供构建块的 Tekton Pipelines,Tekton 作为 Kubernetes 集群上的扩展安装和运行,包含一组 Kubernetes 自定义资源,这些资源定义了您可以为…

redis-连接数占满解决

作者 马文斌 时间 2023-12-12 标签 redis 连接风暴 连接数占满 背景 近期有redis 数据库连不上,起初以为是redis的连接数满了,排查到后面发现问题不简单啊,下面看看具体的排查过程。 连不上的原有有哪些 密码不对 网络不好,丢包 原来…

Openstack开启虚拟化嵌套

好久没写东西了,前两天我准备在虚机上装一个vmware 的虚机,结果失败了,提示如下,由于我是虚机上安装虚机,我的宿主机肯定是开启了vt-x和vt-d的 查了一些资料,这个需要打开nested,先看看nested返回是否为Y&a…

Unity向量按照某一点进行旋转

Unity向量按照某一点进行旋转 一、unity的旋转二、向量按照原点进行旋转注意案例 三、向量按照指定位置进行旋转案例 一、unity的旋转 首先要知道一点就是在Unity的旋转中使用过四元数进行旋转的,如果对一个物体的rotation直接赋值你会发现结果不是你最终想要的结果…

迎新辞旧,欢度元旦

迎新辞旧,欢度元旦 新年钟声即将敲响,欢度元旦的时刻即将来临。在这个美好的时刻,我们纷纷辞旧迎新,放飞自我追逐梦想的翅膀。让羊大师带大家一起来庆祝新年的到来,共同创造美好的开始! 一、迎新辞旧&…

希尔排序详解(C语言)

前言 希尔排序是一种基于插入排序的快速排序算法。所以如果还会插入排序的小伙伴可以点击链接学习一下插入排序(点我点我!) ,相较于插入排序,希尔排序拥有更高的效率,小伙伴们肯定已经迫不及待学习了吧&…

OPNET Modeler帮助文档的打开方式

前面有篇文章修改OPNET帮助文档的默认打开浏览器 & 给Edge浏览器配置IE Tab插件已经提到了打开OPNET Modeler打开帮助文档的方法,有时候打开时会显示如下。 界面中没有什么内容加载出来!我是在Google浏览器中打开的,其他的浏览器也是一样…

10000个jpg图片文件如何按数量放在20个文件夹中的方法

日常工作中在处理大量文件时,如何有效地将它们分类和管理变得至关重要。在这种情况下,有10000个jpg图片,要如何把它们按数量放在20个文件夹,如何避免手动操作呢?现在一起来看看云炫文件管理器批量移动文件的具体操作吧…

智慧燃气为 “ 城市生命线 ” 打造“看得见”的安全

关键词:智慧燃气、智慧燃气平台、智慧燃气管网、燃气数字化、智慧燃气系统、智慧燃气解决方案 近年来,随着互联网技术、物联网技术、大数据、云计算技术的飞速发展,“互联网”已成为重要的国家战略,各行业都在寻求智能化转型之路…

flowable任务分配方式篇动态部门经理:固定分配、表达式分配、监听器分配

这里写自定义目录标题 1、固定分配2、表达式分配在此流程部署了之后,在流程定义信息表中可以看到此流程的相关信息启动流程查看我们设置的变量在task表中,可以看到当前分配人是张三,说明值表达式被解析了 完成任务在张三完成任务之后&#xf…

为什么pmp证书只能对标cspm二级证书?

拿PMP认证可以直接认证CSPM?快来看看你符合哪个等级! PMP认证大家了解的可能比较多,它推出的时间较长,并且仅在国内拿到认证的人数也与日俱增。而CSPM相对来说大家就比较陌生了,它是哪些部门发起的,有什么用…

云渲染UE4像素流送搭建(winows、ubuntu单实例与多实例像素流送)

windows/ubuntu20.4下UE4.27.2像素流送 像素流送技术可以将服务器端打包的虚幻引擎应用程序在客户端的浏览器上运行,用户可以通过浏览器操作虚幻引擎应用程序,客户端无需下载虚幻引擎,本文实现两台机器通过物理介质网线实现虚幻引擎应用程序…

【小白专用】C# 压缩文件 ICSharpCode.SharpZipLib.dll效果:

插件描述: ICSharpCode.SharpZipLib.dll 是一个完全由c#编写的Zip, GZip、Tar 、 BZip2 类库,可以方便地支持这几种格式的压缩解压缩, SharpZipLib 的许可是经过修改的GPL,底线是允许用在不开源商业软件中,意思就是免费使用。具体可访问ICSha…

图片素材管理软件Eagle for mac提高素材整理维度

Eagle for mac是一款图片素材管理软件,支持藏网页图片,网页截屏,屏幕截图和标注,自动标签和筛选等功能,让你设计师方便存储需要的素材和查找,提供工作效率。 Eagle mac软件介绍 Eagle mac帮助你成为更好、…

比宜德停业,奥乐齐死磕,硬折扣该怎样长硬不衰?

作者 | 楚文龙 来源 | 洞见新研社 刚刚过去的周末,让零售行业的从业者神经紧绷。因为,12月23日多个信源曝出,社区硬折扣超市比宜德已公告于12月22日起暂停营业。 作为中国第一家,也是唯一一家规模最大的硬折扣社区连锁店零售商&…

计算机视觉五大技术

目前,计算机视觉是深度学习领域最热门的研究领域之一。计算机视觉实际上是一个跨领域的交叉学科,包括计算机科学(图形、算法、理论、系统、体系结构),数学(信息检索、机器学习),工程…

ERP系统的优缺点有哪些?

企业在考虑引进ERP系统时总是比较谨慎的,毕竟,ERP关乎着企业的整体运营和未来发展。因此,选择适合的ERP系统对企业未来的成功至关重要。要全面评估,看看它到底能给企业带来啥好处,又可能会有啥风险。 看完这篇回答&am…