某一天,开发问我,为什么针对一个查询会有两条记录,且其中一条记录并不符合条件select * from tablea where xxno = 170325171202362928;xxno为 170325171202362928 和 170325171202362930的都出现在结果中。

一个等值查询为什么会有另外一个不同值的记录查询出来呢?

我们一起来看看究竟!

分析

我们查看该表结构,发现xxno 为varchar 类型,但是等号右边是一个数值类型,这种情况下MySQL会如何进行处理呢?官方文档如下:https://dev.mysql.com/doc/refman/5.6/en/type-conversion.html

The following rules describe how conversion occurs for comparison operations: .... 省略一万字 .... In all other cases, the arguments are compared as floating-point (real) numbers.

也就是说,他会将等于号的两边转换成浮点数来做比较。

Comparisons that use floating-point numbers (or values that are converted to floating-point numbers) are approximate because such numbers are inexact. This might lead to results that appear inconsistent:

如果比较使用了浮点型,那么比较会是近似的,将导致结果看起来不一致,也就是可能导致查询结果错误。

我们测试下刚刚生产的例子:

可以发现,字符串的'170325171202362928' 和 数值的170325171202362930比较竟然是相等的。我们再看下字符串'170325171202362928' 和字符串'170325171202362930' 转化为浮点型的结果

我们发现,将两个不同的字符串转化为浮点数后,结果是一样的,

所以只要是转化为浮点数之后的值是相等的,那么,经过隐式转化后的比较也会相等,我们继续进行测试其他转化为浮点型相等的字符串的结果

字符串'170325171202362931'和'170325171202362941'转化为浮点型结果一样,我们看下他们和数值的比较结果

结果也是符合预期的。

因此,当MySQL遇到字段类型不匹配的时候,会进行各种隐式转化,一定要小心,有可能导致精度丢失。

For comparisons of a string column with a number, MySQL cannot use an index on the column to look up the value quickly. If str_col is an indexed string column, the index cannot be used when performing the lookup in the following statement:

如果字段是字符型,且上面有索引的话,如果查询条件是用数值来过滤的,那么该SQL将无法利用字段上的索引

SELECT * FROM tbl_name WHERE str_col=1;

The reason for this is that there are many different strings that may convert to the value 1, such as '1', ' 1', or '1a'.

我们进行测试

mysql > create table tbl_name(id int ,str_col varchar(10),c3 varchar(5),primary key(id),key idx_str(str_col));Query OK, 0 rows affected (0.02 sec)mysql  > insert into tbl_name(id,str_col) values(1,'a'),(2,'b');Query OK, 2 rows affected (0.01 sec)Records: 2  Duplicates: 0  Warnings: 0mysql  > insert into tbl_name(id,str_col) values(3,'3c'),(4,'4d');Query OK, 2 rows affected (0.00 sec)Records: 2  Duplicates: 0  Warnings: 0mysql  > desc select * from tbl_name where str_col='a';+----+-------------+----------+------+---------------+---------+---------+-------+------+--------------------------+| id | select_type | table    | type | possible_keys | key     | key_len | ref   | rows | Extra                    |+----+-------------+----------+------+---------------+---------+---------+-------+------+--------------------------+|  1 | SIMPLE      | tbl_name | ref  | idx_str       | idx_str | 13      | const |    1 | Using where; Using index |+----+-------------+----------+------+---------------+---------+---------+-------+------+--------------------------+mysql  > desc select * from tbl_name where str_col=3;+----+-------------+----------+------+---------------+------+---------+------+------+-------------+| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra       |+----+-------------+----------+------+---------------+------+---------+------+------+-------------+|  1 | SIMPLE      | tbl_name | ALL  | idx_str       | NULL | NULL    | NULL |    4 | Using where |+----+-------------+----------+------+---------------+------+---------+------+------+-------------+1 row in set (0.00 sec)mysql [localhost] {msandbox} (test) > select * from tbl_name where str_col=3;+----+---------+------+| id | str_col | c1   |+----+---------+------+|  3 | 3c      | NULL |+----+---------+------+1 row in set, 2 warnings (0.00 sec)

同时我们可以看到,我们用数值型的3和str_col进行比较的时候,他无法利用索引,同时取出来的值也是错误的,

MySQL针对3c 和 4d这两个值进行了转化,变成了3和4

小结

在数据库中进行查询的时候,不管是Oracle还是MySQL,一定要注意字段类型,杜绝隐式转化,不仅会导致查询缓慢,还会导致结果错误。

mysql 错误的字符串值_这次被坑惨了,MySQL的隐式转换导致了一个线上BUG相关推荐

  1. 在将varchar值id转换为int时失败_MySQL令人咋舌的隐式转换

    导读 作者徐晨亮,MySQL DBA,知数堂学员.热衷于数据库优化,自动化运维及数据库周边工具开发,对MySQL源码有一定的兴趣 本文建议横屏观看,效果更佳 一.问题描述 root@mysqldb 2 ...

  2. mybatis mysql 调用存储过程 多个返回值_被Mybatis坑惨了

    关注米兜Java并置顶,一起涨姿势- 关注米兜 Spring 2020     热点推荐 1 抛去try {...} catch {...} finally {...},让代码更轻便 2 无所不能的J ...

  3. mysql 隐式失误_评“MySQL 隐式转换引起的执行结果错误”

    今天看到一篇关于MySQL隐式转换引发执行结果错误的文章: ====================================================================== ...

  4. mysql隐式转换造成索引失效的事故总结

    隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给mysql,这样 ...

  5. mysql 索引越界_mysql隐式转换造成索引失效的事故总结

    隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给mysql,这样 ...

  6. Scala 高阶函数(作为值的函数、匿名函数、闭包、柯里化)+隐式转换和隐式参数...

    Scala高级特性 1.    学习目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特 ...

  7. mysql数据库隐式表_详解MySQL数据库常见的索引问题:无索引,隐式转换,附实例说明...

    概述 在这些年的工作之中,由于SQL问题导致的数据库故障层出不穷,而索引问题是SQL问题中出现频率最高的,常见的索引问题包括:无索引,隐式转换. 索引问题 1.无索引 当数据库中出现访问表的SQL无索 ...

  8. MySQL 隐式转换 字符串和整型说明

    MySQL 隐式转换 字段类型定义 CREATE TABLE `user` (`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '编号',/* ...... * ...

  9. mysql字符串等于失效_MySql整型索引和字符串索引失效或隐式转换问题

    问题概述 写代码的时候,有一段sql,表示该sql存在隐式转换,不走索引. 经过测试排查后,发现是类型varchar的字段, 我使用条件传入了数值型的值. 问题重现 首先我们先创建一张用户表test_ ...

  10. js date转成 时间字符串_秋招快要开始了,前端笔试中的坑位-JS隐式转换问题

    我们在写笔试题的时候,经常碰到涉及隐式转换的题目,例如 "1" + 2 obj + 1 [] == ![] [null] == false === 和 == === 叫做严格运算符 ...

最新文章

  1. 关系抽取论文整理,核方法、远程监督的重点都在这里
  2. html5游戏加载动画,HTML5 战场3游戏的加载指示动画
  3. BlockChain:《Blockchain Gate》听课笔记——区块链构筑的比特世界 VS 现实的原子世界
  4. 机器学习库一:scikit-learn
  5. 谈谈.NET Core中基于Generic Host来实现后台任务
  6. 使用 .NET 平台,如何玩转 Universal Windows 应用?
  7. Redis 未授权访问漏洞利用
  8. java材质_教程 - JAVA版材质包制作教程 | MineBBS 我的世界中文论坛
  9. 让程序像人一样的去批量下载歌曲?Python采集付费歌曲
  10. 【系统安装】MediaCreationTool工具制作U盘安装win10系统
  11. Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统 nsswitch.conf配置文件...
  12. 设计模式:行为型模式
  13. osm服务器 显示乱码,怎样获得osm上的行政区划shp文件
  14. 求购安霸Ambarella IONE这颗料的SDK开发工具包 Software Development Kit
  15. CEOI 2020, Day 2 A,B题解 CF1403A CF1403B
  16. python手机自动回复_用python itchat写一个微信机器人自动回复
  17. 采访 | 苹果菲尔·席勒:Face ID非常独特 其他家的人脸识别都很糟糕
  18. Flutter吸顶效果
  19. python获取接口返回值_Python+request 登录接口reponse的返回值token跨py文件的传递《二》...
  20. 1.VB_求解圆的体积

热门文章

  1. mysql 多版本删除_高性能MySQL(四):多版本并发控制
  2. 2021-09-14 if__name__ == ‘__main__‘的用法
  3. 选择语句详解(C++)
  4. 【知识蒸馏】Distilling the Knowledge in a Neural Network
  5. xgboost算法_Xgboost调参小结
  6. 学计算机用16g内存,说出去就是个笑话,两万多电脑内存才16G,我认为这配置不合理!...
  7. 微信读书vscode插件_众所周知,拥有了vscode就拥有了一切
  8. 自适应图片九宫格 css,高度自适应的九宫格效果
  9. python plot 坐标轴范围_Python,Matplotlib,子图:如何设置轴范围?
  10. 图:杭州中级人民法院演讲比赛于9月29日圆满结束.其主题图片展示。