【惊天BUG】select * from 表 where value = 0;查询结果让大师兄都傻眼了

2024-09-01 12:12

本文主要是介绍【惊天BUG】select * from 表 where value = 0;查询结果让大师兄都傻眼了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

🍊缘由

线上问题把我坑,一查数据让我蒙

在这里插入图片描述

🐣闪亮主角

大家好,我是JavaDog程序狗

今天跟大家分享一个本狗造成的线上事故, 一个简单的SQL查询语句导致的bug

😈你想听的故事

最近狗哥有点飘,但是bug从来不会放过任何一个摸鱼的人…

一个阳光明媚的下班点,发现组长表情凝重,愁眉不展,遂狗哥上来询问,原来是之前狗哥写的迭代线上出了问题!

暴露的问题是本不该出现的数据,竟然被查出来了!

从一脸愁容,到两脸蒙蔽,通过分析发现代码并没有问题,最后只能定位到SQL查询中…

发现 select * from 表 where value = 0 ,竟然没有过滤出想要的数据,最终定位到问题。

遂跟大家分享一个从业8年第一次遇到的神奇bug,SQL中隐式转换 where 值=0 引发的问题

在这里插入图片描述

正文

🎯主要目标

1.问题重现
2.MySQL隐式转换

🍪目标讲解

一.问题重现
1.问题模拟

🌰举例

一个person表,假设其中有sex性别字段类型为varchar,0代表女,1代表男,建表如下

在这里插入图片描述

CREATE TABLE `person` (`id` bigint(20) NOT NULL COMMENT 'id',`name` varchar(255) NOT NULL COMMENT '名称',`age` int(10) NOT NULL COMMENT '年龄',`sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '性别(男;女)',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入模拟数据

在这里插入图片描述

INSERT INTO `demo`.`person` (`id`, `name`, `age`, `sex`) VALUES (1, '张三', 20, '男');
INSERT INTO `demo`.`person` (`id`, `name`, `age`, `sex`) VALUES (2, '李四', 30, '女');
INSERT INTO `demo`.`person` (`id`, `name`, `age`, `sex`) VALUES (3, '小姐姐', 18, '0');
INSERT INTO `demo`.`person` (`id`, `name`, `age`, `sex`) VALUES (4, '王五', 20, '男');
2.查询语句

现在我们要查询性别为0的问题数据

在这里插入图片描述

SELECT * FROM person WHERE sex = 0;

执行结果

在这里插入图片描述
结果是不是出人意料,竟然将所有数据都查出,是不是失效出bug了?

其实这就是MySQL的隐式特性,而不是什么bug,别急后面慢慢详解…


二.MySQL隐式转换
1.隐式转换是什么?

MySQL中的隐式类型转换是指当执行某些操作时,如比较操作或其他需要特定数据类型参数的操作时,如果参与操作的表达式或列的数据类型不匹配,MySQL将会自动进行数据类型转换以适应预期的数据类型。

👽人话解释

就是字段类型不匹配,mysql会自动转,如果你以数字0为条件,mysql就会将字段内容转成数字进行处理

2.示例问题分析

在MySQL中,当你尝试用整数 0 作为条件去查询一个 VARCHAR 类型的字段时,MySQL 会尝试将 VARCHAR 字段的内容转换为数字进行比较

这种情况下,MySQL 会检查字符串的开始部分是否可以解析为一个数字。如果可以,它将使用这个数字值进行比较;如果不能解析为数字,则默认使用 0 进行比较。

也就是说

SELECT * FROM person WHERE sex = 0; 和 SELECT * FROM person WHERE sex = ‘0’;

两个表达的意思完全不一样,用0会查到所有非数字开头的字符串,用其他数字查则会匹配到与之对应数字开头的字符串

在这里插入图片描述

在这里插入图片描述

总结

1.问题重现:

  • 创建 person 表,sex 字段为 VARCHAR 类型。
  • 插入数据,包括 sex 为 ‘男’、‘女’、‘0’ 等。
  • 查询 SELECT * FROM person WHERE sex = 0; 返回所有数据,而非仅 ‘0’。

2.原因分析:

  • MySQL 尝试将 VARCHAR 字段内容转换为数字进行比较。
  • 如果字符串可以解析为数字,则使用该数字;否则默认使用 0。

3.解决方法:

  • 显式类型转换:SELECT * FROM person WHERE CAST(sex AS SIGNED) = 0;
  • 直接使用字符串比较:SELECT * FROM person WHERE sex = ‘0’;

4.结论

  • 隐式转换会导致意外结果:使用整数 0 查询 VARCHAR 字段时,MySQL 会尝试将字符串转换为数字。
  • 显式类型转换更安全:显式地进行类型转换可以确保查询结果符合预期。

🍈猜你想问

如何与狗哥联系进行探讨
关注公众号【JavaDog程序狗】

公众号回复【入群】或者【加入】,便可成为【程序员学习交流摸鱼群】的一员,问题随便问,牛逼随便吹,目前群内已有超过300+个小伙伴啦!!!

2.踩踩狗哥博客

javadog.net

里面有狗哥的私密联系方式呦 😘

大家可以在里面留言,随意发挥,有问必答

在这里插入图片描述

🍯猜你喜欢

文章推荐

【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)

【规范】看看人家Git提交描述,那叫一个规矩

【项目实战】SpringBoot+uniapp+uview2打造H5+小程序+APP入门学习的聊天小项目

【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序

【模块分层】还不会SpringBoot项目模块分层?来这手把手教你!

这篇关于【惊天BUG】select * from 表 where value = 0;查询结果让大师兄都傻眼了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126898

相关文章

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

MYSQL查询结果实现发送给客户端

《MYSQL查询结果实现发送给客户端》:本文主要介绍MYSQL查询结果实现发送给客户端方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql取数据和发数据的流程(边读边发)Sending to clientSending DataLRU(Least Rec

MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)

《MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)》掌握多表联查(INNERJOIN,LEFTJOIN,RIGHTJOIN,FULLJOIN)和子查询(标量、列、行、表子查询、相关/非相关、... 目录第一部分:多表联查 (JOIN Operations)1. 连接的类型 (JOIN Types)

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

解读@ConfigurationProperties和@value的区别

《解读@ConfigurationProperties和@value的区别》:本文主要介绍@ConfigurationProperties和@value的区别及说明,具有很好的参考价值,希望对大家... 目录1. 功能对比2. 使用场景对比@ConfigurationProperties@Value3. 核