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.mfbz.cn/a/606630.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis 实战3

系列文章目录 本文将从跳跃表的实现、整数集合来展开 Redis 实战 Ⅲ 系列文章目录跳跃表的实现跳跃表节点层 前进指针跨度 整数集合的实现升级升级的好处提升灵活性节约内存 降级整数集合 API总结 跳跃表的实现 Redis 的跳跃表由 redis.h/zskiplistNode 和 redis.h/zskiplist…

面向初学者:什么是图数据库

当数据成为关键生产要素,许多企业开始面临利用海量数据辅助企业复杂决策的现实难题。而在数据爆发式增长,关联复杂度激增的趋势下,图数据库成为企业加工关联数据、挖掘隐藏价值、智能决策升级的关键技术之一,在全球范围内开始被使…

如何更快地执行 Selenium 测试用例?

前言: 当我们谈论自动化时,首先想到的工具之一是 Selenium。我们都知道Selenium WebDriver 是一个出色的 Web 自动化工具。实施Selenium 自动化测试的主要原因是加速 selenium 测试。在大多数情况下,Selenium 的性能比手动的要好得多。但是&…

(2024,DONN,OCNN,复数域,交替的非线性激活层与振荡器层,复值反向传播)深度振荡神经网络

Deep Oscillatory Neural Network 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 1. 简介 2. 方法 2.1 深度振荡神经网络(DONN) 2.2 振荡卷积神经网…

人物特效游戏玩法,门坎低,适合新手上手项目【揭密】

项目简介: 本项目涉及我们日常使用的美肤产品和效果维持,我们需要提交自己的作品,完成官方网站发布的任务。任务完成后,提交审核,一旦审批通过,收益就会到账。 项 目 地 址 : laoa1.cn/1961.…

Python-VBA函数之旅-round函数

目录 一、round函数的常见应用场景 二、round函数使用注意事项 三、如何用好round函数? 1、round函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页: https://blog.csdn.net/ygb_1024?spm1010.2…

部署tomcat部署LNAMT

这里写目录标题 部署tomcatjava环境安装 部署LNAMT更改tomcat端口号 tomcat就是中间件之一,tomcat本身是一个容器,专门用来运行java程序,java语言开发的网页.jsp就应该运行于tomcat中。而tomcat本身的运行也依赖于jdk环境。 部署tomcat java…

LVS 负载均衡部署 NAT模式

一、环境准备 配置环境: 负载调度器:配置双网卡 内网:172.168.1.11(ens33) 外网卡:12.0.0.1(ens37)二台WEB服务器集群池:172.168.1.12、172.168.1.13 一台NFS共享服务器:172.168.1.14客户端&#xff…

2024年全网最新AI实景自动无人直播软件:引领智能直播新潮流;打造智能化、互动性强的直播平台

随着互联网的飞速发展,直播已经成为商家品牌推广和产品宣传的重要方式。然而,AI实景自动无人直播软件的问世,进一步推动了直播行业的智能化进程,为商家带来了全新的直播体验。(ai无人自动直播大量招商加盟;…

【解疑】ZIP分卷压缩文件如何设置和取消密码?

压缩大文件,我们可以设置压缩成ZIP分卷文件,这样更利于传输和存储。如果分卷文件比较重要,还可以设置密码保护,那ZIP分卷压缩文件的密码如何设置和取消呢?下面一起来看看吧! 设置ZIP分卷密码: …

配电室智能巡检机器人

近年来,生产过程高度自动化,各工矿企业关键场所需定期巡检维护。但目前巡检主要靠人工,既耗时费力效率又低,且受环境等因素影响,巡检难以全面规范,隐患或问题易被忽视。在此情况下,如何利用现有…

Python爬虫基础知识学习(以爬取某二手房数据、某博数据与某红薯(书)评论数据为例)

一、爬虫基础流程 爬虫的过程模块化,基本上可以归纳为以下几个步骤: 1、分析网页URL:打开你想要爬取数据的网站,然后寻找真实的页面数据URL地址; 2、请求网页数据:模拟请求网页数据,这里我们介…

安卓模拟器访问主机局域网

误打误撞能够访问主机局域网了 但是不太懂是因为哪一部分成功的 先记录一下 PC:mac系统 安卓编译器:Android Studio 步骤 只需要在PC上进行设置 1. 在【设置】中,打开已连接的Wi-Fi的【详细信息】 2. TCP/IP --> 配置IPv6,修…

roofline model加速模型部署最后一公里

文章目录 模型部署教程来啦:)什么是Roofline Model?算法模型相关指标计算量计算峰值参数量访存量带宽计算密度kernel size对计算密度的影响output size对计算密度的影响channel size对计算密度的影响group convolution对计算密度的影响tensor reshape对计算密度的影…

网站使用SSL证书有什么好处

SSL证书是一种用于加密在网络上传输的数据以确保安全性和隐私的数字证书。下面我们来谈谈一个网站使用SSL证书后有哪些好处: 首先,使用SSL证书可以保护用户的隐私。在没有SSL证书的情况下,用户的个人信息和敏感数据可能会被黑客窃取或篡改。…

npm安装指定版本,npm删除依赖,卸载依赖

安装指定版本 npm中安装指定的版本号,格式为 ‘包名版本号’ npm install 包名称版本号 --save 例如安装jquery: npm install jquery3.0.0 --save在package.json里面可以看到对应的包: "jquery": "^3.0.0"注意:已有…

基于springboot实现医院药品管理系统项目【项目源码+论文说明】

基于springboot实现医院药品管理系统演示 摘要 身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得到提升,而读书就…

CentOS 重启网络失败service network restart

命令 service network restart 提示 Job for network.service failed because the control process exited with error code. See “systemctl status network.service” and “journalctl -xe” for details. 原因分析 使用journalctl -xe命令查看日志后的具体错误 -- Un…

基于springboot实现疾病防控综合系统项目【项目源码+论文说明】

基于springboot实现疾病防控综合系统演示 摘要 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以&…

PDPS15---安装过程---常遇问题---分享

目录 问题1 安装失败 1.1 运行第一步出错 1.2 解决 问题2 路径错误 2.1 错误 2.2 解决 问题3 运行失败 3.1 无法找到路径 3.2 原因分析 3.3 解决 问题4 拒绝访问 4.1 出现提示 4.2 分析 4.3 解决 问题5 许可证过期 5.1 PD找不到许可证 5.2 解决 问题1 安装失败…
最新文章