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

 更新时间:2023年12月26日 16:19:22   作者:掉发的小王  
这篇文章主要为大家详细介绍了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中varchar和int隐式转换的注意事项的文章就介绍到这了,更多相关MySQL隐式转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL进行数据库审计的详细步骤和示例代码

    MySQL进行数据库审计的详细步骤和示例代码

    数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大家介绍MySQL进行数据库审计的详细步骤和示例代码,感兴趣的朋友一起看看吧
    2025-07-07
  • MySQL用户授权管理及白名单的实现

    MySQL用户授权管理及白名单的实现

    MySQL作为一种常用的关系型数据库管理系统,在权限管理和用户认证方面提供了丰富的功能和方案,本文主要介绍了MySQL用户授权管理及白名单的实现,感兴趣的可以了解一下
    2023-09-09
  • MySQL修改密码的四种方式详解

    MySQL修改密码的四种方式详解

    文章介绍了4种修改MySQL密码的方法,包括使用setpassword命令、mysqladmin命令、修改user表以及忘记密码时的处理步骤,感兴趣的朋友一起看看吧
    2025-03-03
  • mysql中的int(5)到底有是多长

    mysql中的int(5)到底有是多长

    这篇文章主要介绍了mysql中的int(5)到底有是多长,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • MySQL 自定义变量的概念及特点

    MySQL 自定义变量的概念及特点

    MySQL 是可以自定义临时变量的,而临时变量在做查询优化和静态查询分析时十分有用。而实际上很少有人记得 MySQL 的自定义变量。本篇文章讲述 MySQL 的自定义变量的概念及特点。
    2021-05-05
  • MySQL存储路径迁移的详细步骤

    MySQL存储路径迁移的详细步骤

    在构建Web应用程序时,MySQL是存储数据的核心工具,在云服务器上,正确设置MySQL的存储路径对应用性能至关重要,通过迁移,我们不仅解决了空间不足的问题,还能让数据库运行得更快,所以本文将给大家介绍MySQL存储路径迁移的详细步骤,需要的朋友可以参考下
    2024-06-06
  • mysql之如何把查询的结果保存到新表

    mysql之如何把查询的结果保存到新表

    这篇文章主要介绍了mysql之如何把查询的结果保存到新表问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • mysql数据库中1045错误的解决方法

    mysql数据库中1045错误的解决方法

    这篇文章主要为大家详细介绍了MySQL数据库中1045错误的解决方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • mysql中 char 和 varchar 的区别解析

    mysql中 char 和 varchar 的区别解析

    本文详细解释了MySQL中CHAR和VARCHAR两种字符串数据类型的区别,包括长度处理、存储方式、尾部空格处理和性能考量,并给出了选择建议,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-11-11
  • mysql5.7.14 解压版安装配置方法图文教程(win10)

    mysql5.7.14 解压版安装配置方法图文教程(win10)

    这篇文章主要为大家详细介绍了win10下mysql5.7.14 winx64安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12

最新评论