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.hqwc.cn/news/681244.html

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

相关文章

解决html2canvas生成图片慢的问题

// 主要看那个点击事件就行 <divclass"textBox-right-board-group"v-for"item in screenList":key"item.id"><!-- 获取不同分辨率下的屏幕的展示的文字大小DPI&#xff1a; fontSize: getFontSize(item.resolutionRatio), --><di…

NTP网络时间服务器如何实现煤矿智能化管理?

随着煤矿行业的不断发展&#xff0c;安全生产和效率是煤矿企业始终关注的重点。NTP网络时间服务器作为一种高精度的时间同步技术&#xff0c;其应用在煤矿领域也逐渐得到广泛推广。 ZRBG1000 NTP网络时间服务器是对煤矿等行业对网络时间同步应用需求设计的高准确度、高性能NTP网…

买入期权是什么意思?

今天期权懂带你了解买入期权是什么意思&#xff1f;买入期权&#xff1a;也称看涨期权。一种赋予其持有者以特定的价格、在特定的到期日当天或之前买入某种资产的权力的金融工具。 买入期权是什么意思&#xff1f; 买入期权也称看涨期权。即赋予其持有者在到期日或到期日之前按…

OpenAI 发布 AI 生成图片检测器;Meta 推出 AI 广告创意工具;Google 正式发布 Pixel 8a,主打 AI

OpenAI 发布 AI 生成图片检测器 OpenAI 昨日官宣推出专用的 AI 监测工具&#xff0c;用于监测图片是否由其旗下 AI 图片生成工具 DALL-E 生成&#xff0c;准确率高达 98.8%。 不过该公司表示&#xff0c;这个检测工具并非旨在检测 Midjourney 和 Stability 等其他流行生成器生…

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

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

五张图教你快速掌握设备CPU占用率高相关知识

以下五张图教你快速了解并掌握CPU占用率高的相关知识&#xff0c;包括CPU占用率高造成的影响、引起CPU占用率高的常见原因、如何定位CPU占用率高、如何解决CPU占用率高和如何尽量避免CPU占用率高 点击查看相关内容&#xff1a; 科普&#xff1a;CPU是怎么被制造出来的&#xf…

Linux流程控制

if语句 基本格式 if condition thencommand1 fi 写成一行 if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi if-else语句 格式 if condition thencommand1 command2...commandN elsecommand fi if else- if else if condition1 th…

JAVA版本的ATM编程问题记录

前段时间用C语言写了个银行ATM系统&#xff0c;还写了一篇文章记录了一些&#xff0c;C语言的ATM文章。后来又用IDEA写了一个JAVA版本的银行ATM。有人就会问为啥浪费这个时间写ATM呢&#xff1f;&#x1f9d0;其实是我本科代码没学好&#xff0c;所以现在想利用比较熟悉的ATM系…

网络相关笔记

IPv4地址 IPv4地址通常以“点分十进制”形式书写&#xff0c;即四个0-255之间的十进制数&#xff0c;各数之间用英文句点&#xff08;.&#xff09;分隔&#xff0c;例如&#xff1a;192.0.2.1。总共32位的地址空间可以表示大约42亿个不同的地址。 IPv4地址结构包括&#xff…

【python数据分析基础】—pandas透视表和交叉表

目录 前言一、pivot_table 透视表二、crosstab 交叉表三、实际应用 前言 透视表是excel和其他数据分析软件中一种常见的数据汇总工具。它是根据一个或多个键对数据进行聚合&#xff0c;并根据行和列上的分组键将数据分配到各个矩形区域中。 一、pivot_table 透视表 pivot_tabl…

微信公众号随心自定义商城源码系统 带完整的安装代码包以及安装部署教程

传统的微信商城模板化严重&#xff0c;无法满足企业的个性化需求。小编给大家分享一款随心自定义商城源码系统。该系统支持高度自定义&#xff0c;企业可以根据自身需求灵活调整商城页面、功能模块和运营策略&#xff0c;打造独具特色的微信商城。 以下是部分代码示例&#xf…

图片优化?imageView2/2/w/300/h/200

使用?imageView2/2/w/300/h/200在图片后面拼上去会使图片体积变小&#xff0c;加载速度优化; 例&#xff1a; 未使用&#xff1a; https://cdn.dev.scrm.juplus.cn/hzGkmfPH6Yep7nZFmFoo0j8Qf.jpg 使用后&#xff1a; https://cdn.dev.scrm.juplus.cn/hzGkmfPH6Yep7nZFmFo…