mysql中varchar与bigint直接比较会导致精度丢失以至于匹配到多行数据

  在mysql中,我们都知道如果一个索引字段使用了函数或者计算那么查询的时候索引会失效,可是我相信在联表的时候我们只会关注两个表关联字段是否都创建了索引,却没有关注过这两个字段的类型是否一致,如果不一致的话索引是会失效的,因为数据库会对两个不同类型的字段进行隐式的类型转换。
  上面的坑倒比较容易发现,但是在mysql存储过程中如果你的变量声明的时候是bigint,但是与他比较的字段是varchar的时候就不容易发现了。我今天在执行一个存储过程的时候我发现结果不对,明明在表中这个字段值是唯一的但是执行的时候就会查出多条报错子查询返回多行数据。
  简单说,我有一个表q1,它的表结构如下:
在这里插入图片描述
数据大致长这样,c4是连续的19位的bigint(其实就是雪花值,但是存进去的时候没有注意到c4是varchar的),从1111111111111111111开始递增,有200多行
在这里插入图片描述
  我执行以下sql,能查出122行数据:

select c4 from q1 where c4 = 1111111111111111111 -- 122

在这里插入图片描述
  我执行以下sql,能准确查出行1数据:

select c4 from q1 where c4 = '1111111111111111111' -- 1

在这里插入图片描述
  1111111111111111111很明显是一个19位的bigint并没有超出bigint的范围,在存储过程中我声明的时候就是bigint,只不过我在这简单举例了。很显然后者才是我们期望的数据,我并没有搜到mysql官方说varchar类型与bigint比较的时候会先转换为那种类型进行判断,只知道会先进行隐式类型转换再进行比较(如果有朋友知道原理的话欢迎赐教)。我把c4字段类型从varchar改为bigint后发现上面两个sql查询结果都只有一行。
  经过我的尝试,在c4仍为varchar的情况下,我觉得varchar与bigint进行比较的时候mysql应该是先转换为双精度浮点数double再进行比较的,由于bigint的位数超过了16位所以会导致丢失一部分精度,所以会匹配上多行数据。
  而在mysql中double的精度的精度为16位有效数据,我将其中两行改为16为长度的数字11111111111111111111111111111112,然后用下面的sql直接查16位的1111111111111111结果只有一行:

select c4 from q1 where c4 = 1111111111111111;-- 16位,只有一行准确结果

在这里插入图片描述
这说明在double的范围是准确的。
  因此如果要比较varchar和bigint类型的话,如果允许的话就改为统一的类型进行比较。也可以将bigint转换为varchar进行比较,或者两者都使用更高精度的Decimal类型进行比较。
  我猜测隐式转换为double也是和下面的查询有关:

select c4 + '0' 隐式类型转换,c4,cast(c4 as Decimal(19,0)) `Decimal`
from q1 

在这里插入图片描述
一看第一列是双精度浮点数(double)类型,结合上面的16为精度测试所以这么猜测。

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

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

相关文章

Windows系统完全卸载删除 Node.js (包含控制面板找不到node.js选项情况)

1.打开cmd命令行窗口,输入npm cache clean --force 回车执行 2.打开控制面板,在控制面板中把Node.js卸载 移除之后检查环境变量是否也移除:点击Path,点击编辑。 把环境变量中和node有关的全部移除,然后点击确定。 3.重…

WPF之创建无外观控件

1,定义无外观控件。 定义默认样式,在其静态构造函数中调用DefaultStyleKeyProperty.OverrideMetadata()。 //设置默认样式DefaultStyleKeyProperty.OverrideMetadata(typeof(ColorPicker), new FrameworkPropertyMetadata(typeof(ColorPicker))); 在项目…

Android C++ 开发调试 LLDB 工具的使用

文章目录 调试环境准备基础命令Breakpoint CommandsWatchpoint CommandsExamining VariablesEvaluating ExpressionsExamining Thread StateExecutable and Shared Library Query Commands 参考: Android 中在进行 NDK 开发的时候,我们经常需要进行 C 代…

为什么互联网行业这两年突然就不行了?

前言: 本人正好最近十年基本都是在互联网行业,真正算是经历了行业的起伏波澜,火的时候被烤的滚烫,冷的时候被冻得冰凉,都算是切身感受到了。 首先,互联网行业的“行”与“不行”,还是一个相对…

短剧新纪元:引领潮流的短剧小程序开发,一触即达精彩世界

在信息爆炸的时代,短视频以其短小精悍、内容丰富的特点迅速崛起,成为人们日常生活中不可或缺的一部分。然而,短视频的短暂与碎片化,有时难以满足观众对完整故事的需求。为此,我们倾力打造了一款短剧小程序,…

如何修复连接失败出现的错误651?这里提供修复方法

错误651消息在Windows 7到Windows 11上很常见,通常会出现在一个小的弹出窗口中。实际文本略有不同,具体取决于连接问题的原因,但始终包括文本“错误651”。 虽然很烦人,但错误651是一个相对较小的问题,不应该导致计算…

AI图书推荐:ChatGPT在真实商业世界中的应用

《ChatGPT在真实商业世界中的应用》 (Unleashing The Power of ChatGPT: A Real World Business Applications)首先概述了ChatGPT及其在对话式人工智能领域的影响。接着,你将深入了解ChatGPT的技术方面,理解机器学习算法和自然语言处理如何在后台工作。然…

Android进阶之路 - 静态会员进度条

年后这个新版本加入了VIP模块,有幸正好由我来负责,可以再积累一下这方面的知识。 那段时间看了一本书,书中说到初级码农的特性之一就是完全集中于某些功能,忽略了了很多成长机会,所以重复性劳作带来的成长值有限&#…

【YOLO】目标检测 YOLO框架之train.py参数含义及配置总结手册(全)

1.一直以来想写下基于YOLO开源框架的系列文章,该框架也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下YOLO目标检测相关知识体系,之前实战配置时总是临时性检索些注释含义,但…

spring模块(六)spring监听器(2)@EventListener

一、介绍 监听器的简化写法 二、原理 三、使用 Slf4j Component public class MyTask {EventListenerpublic void onApplicationEvent(ApplicationEvent event) {if (event instanceof ContextRefreshedEvent) {log.info("监听到 ContextRefreshedEvent...");}if…

水电抄表方案是什么?

1.概述:水电抄表方案的重要性 水电抄表方案是现代城市管理中不可或缺的一部分,它涉及到了能源管理、费用结算和公共服务等多个领域。传统的抄表方式需要工作人员上门服务,费时费力且效率低下。随着科技的发展,智能化的水电抄表方…

融知财经:期货交易原理是怎样的?期货交易有哪些特征?

期货的原理是基于对某期货品种未来走势的判断而形成对其合约的买卖交易,因此期货可以解释为买涨或买跌。买涨,即看多交易,预期某期货品种未来价格上涨而进行的买入开仓交易;买跌,即看空交易,预期某期货品种…

Java学习第05天-编程思维与编程能力

文章目录 综合应用案例:找素数数组元素的复制数字加密模拟双色球 综合应用 涉及的知识点: 变量、数组运算符:基本运算符、关系运算符、逻辑运算符流程控制:if、switch、for、while、死循环、循环嵌套跳转关键字:break、…

Ps 滤镜:像素化

Ps菜单:滤镜/像素化 Filter/Pixelate “像素化”子菜单中的滤镜可以将图像以其他形状的元素重新再现出来。它并不是真正地改变了图像像素点的形状,它只是在图像中表现出某种基础形状的特征,以形成一些类似像素化的形状变化。 彩块化 Facet “…

17.接口自动化学习-日志

1.日志输出渠道 &#xff08;1&#xff09;文件格式 xx.log &#xff08;2&#xff09;控制台输出 2.日志级别 debug<info<warnning<error<critical 3.代码实现 from utils.handle_path import log_path import logging import datetime def logger(fileLogTr…

mac通过termius连接Linux服务器

mac上安装 linux系统 如果有 linux服务器账号密码&#xff0c;那么上一步可忽略&#xff1b; 比如&#xff1a;直接连接阿里云或腾讯云账号 1. 安装termius 链接: https://pan.baidu.com/s/1iYsZPZThPizxqtkLPT89-Q?pwdbw6j 提取码: bw6j 官网 Termius - SSH platform for …

springcloud报错:Failed to start bean‘webServerStartStop‘

如果你正在使用nacos进行服务注册&#xff0c;然后报一下错误&#xff1a; 那就说明的nacos没有打开&#xff0c;所以找到你的下载nacos的文件夹 好了&#xff0c;错误完美解决~

elk + filebeat 8.4.3 收集nginx日志(docker部署)

ELK filebeat docker部署 一、 elasticsearch部署1、运行elasticsearch临时配置容器2、拷贝文件目录到本地3、检查elasticsearch.yml4、删除之前elastic&#xff0c;运行正式容器5、docker logs记录启动日志 二、部署kibana1、运行kibana临时配置容器2、docker拷贝配置文件到本…

sql 注入 1

当前在email表 security库 查到user表 1、第一步&#xff0c;知道对方goods表有几列&#xff08;email 2 列 good 三列&#xff0c;查的时候列必须得一样才可以查&#xff0c;所以创建个临时表&#xff0c;select 123 &#xff09; 但是你无法知道对方goods表有多少列 用order …

毕业论文怎么写? 推荐4个AI工具

写作这件事一直让我们从小学时期就开始头痛&#xff0c;初高中时期800字的作文让我们焦头烂额&#xff0c;一篇作文里用尽了口水话&#xff0c;拼拼凑凑才勉强完成。 大学时期以为可以轻松顺利毕业&#xff0c;结果毕业前的最后一道坎拦住我们的是毕业论文&#xff0c;这玩意不…