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

news2024/11/20 9:39:44

  在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.coloradmin.cn/o/1655090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uni-app实战在线教育类app开发

随着移动互联网的快速发展,教育行业也在不断向在线化、数字化方向转型。开发一款功能丰富、用户体验优秀的在线教育类 App 对于满足学习者需求、促进教育行业的发展至关重要。本文将介绍如何利用 Uni-App 进行在线教育类 App 的开发,让您快速上手&#x…

Python 全栈体系【四阶】(三十九)

第五章 深度学习 八、目标检测 3. 目标检测模型 3.2 YOLO 系列 3.2.4 YOLOv4(2020 年 4 月) YOLOv4 将最近几年 CV 界大量的研究成果集中在一套模型中,从检测速度、精度、定位准确率上有了明显改善(相对于 YOLOv3&#xff0c…

前端项目加载离线的百度地图,利用工具进行切指定区域的地图影像,自定义图层getTilesUrl

百度地图在开发中我们经常使用,但是有些项目是需要在内网进行,这时候我们不得不考虑项目中一些功能需要请求外网静态资源,比如百度地图。只有把包下载到本地,才能让静态资源文件的正常的访问。 目录 获取百度地图开发秘钥 引入在…

yolov8任务之目标检测

对象检测 对象检测是一项涉及识别图像或视频流中对象的位置和类别的任务。对象检测器的输出是一组包围图像中对象的边界框,以及每个框的类标签和置信度分数。当您需要识别场景中感兴趣的对象,但不需要确切知道对象在哪里或其确切形状时,对象检…

网络安全之ACL

ACL:访问控制列表——控制列表(策略列表),是一个控制工具。 功能:!、定义感兴趣路由(控制层面)。2、定义感兴趣流量(数据层面)。 例如: 假设在该…

AI换脸原理(7)——人脸分割参考文献TernausNet: 源码解析

1、介绍 这篇论文相对来说比较简单,整体是通过使用预训练的权重来提高U-Net的性能,实现对UNet的改进。该方法也是DeepFaceLab官方使用的人脸分割方法。在介绍篇我们已经讲过了UNet的网络结构和设计,在进一步深入了解TernausNet之前,我们先简单回顾下UNet。 U-Net的主要结构…

Django Admin后台管理:高效开发与实践

title: Django Admin后台管理:高效开发与实践 date: 2024/5/8 14:24:15 updated: 2024/5/8 14:24:15 categories: 后端开发 tags: DjangoAdmin模型管理用户认证数据优化自定义扩展实战案例性能安全 第1章:Django Admin基础 1.1 Django Admin简介 Dj…

【爬虫】爬取A股数据写入数据库(二)

前几天有写过一篇 【爬虫】爬取A股数据写入数据库(一),现在继续完善下,将已有数据通过ORM形式批量写入数据库。 2024/05,本文主要内容如下: 对东方财富官网进行分析,并作数据爬取,使…

ORA-28575: unable to open RPC connection to external procedure agent

环境: Oracle 11.2.0.4x64 RAC AIX6.1版本SDE for aix oracle11g版本10.0 x64 sde配置情况如下: 检查oracle和grid用户下的$ORACLE_HOME/hs/admin/extproc.ora文件均包含有如下: SET EXTPROC_DLLSANY 两个节点sde下的user_libraries都正常…

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

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

Duplicate File Finder Pro for Mac激活版:重复文件清理软件

在繁杂的文件管理中,你是否曾为重复文件而烦恼?Duplicate File Finder Pro for Mac,正是你不可或缺的得力助手。这款专业级工具,能够迅速扫描并定位Mac系统中的重复文件,让你的存储空间恢复清爽。 通过强大的算法支持&…

天诚人脸物联网锁+网约房管理系统为智慧酒店、民宿管理赋能

随着互联网技术的发展,“网约房”逐渐步入受众视野,在改变旅客入住模式和生活方式的同时,为旅客旅游住宿创造了新的选择,也为拥有冗余房间资源的房东提供了新的营收路径。但是,网约房的管理问题频发,需要数…

Android 右键 new AIDL 无法选择

提示 (AIDL File)Requires setting the buildFeatures.aidl to true in the build file) 解决方式: 在app的build.gradl中 adnroid{} 添加: buildFeatures{aidl true}

SpringCloud Alibaba Sentinel 修改Dashboard用户名和密码

目录 一、下载Sentinel的Jar包 二、在启动时修改用户名和密码的命令 三、测试登录成功 在网上找到了一大堆文章,没一个有用的,最终还是通过不断测试找到了这个方法。 一、下载Sentinel的Jar包 Releases alibaba/Sentinel GitHub 二、在启动时修改…

Electron项目中将CommonJS改成使用ES 模块(ESM)语法preload.js加载报错

问题 将Electron项目原CommonJS语法改成使用ES 模块(ESM)语法,preload.js一直加载不到,报错如下: VM111 renderer_init:2 Unable to load preload script: D:\Vue\wnpm\electron\preload.js VM111 renderer_init:2 E…

Postgresql使用dblink实现跨库查询

一、背景介绍 回调表callback,在test数据库下,数据内容如下 公司表company,在release数据库下,数据内容如下 现在的需求是查询company公司下的callback回调数据 二、实现思路 正常的想法直接两张表关联查询即可,很…

meshlab: pymeshlab保存物体的横截面(compute planar section)

一、关于环境 请参考:pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考,禁止转载和引用,仅供个人学习。 本文所给出的例子是https://download.csdn.net/download/weixin_42605076/89233917中的…

Spring Security初探

url说明方法/login/oauth/authorize无登录态时跳转到/authentication/require,有登录态时跳转到/loginorg.springframework.security.oauth2.provider.endpoint.AuthorizationEndpoint#authorize/authentication/require自己写的用于重定向到登录页面的urlcn.merryy…

香港Web3,步履蹒跚

4月30日,6支香港虚拟资产现货ETF在香港交易所敲钟上市,正式迎来市场首秀。 而在前一周,香港证监会(SFC)官网就已列出华夏基金(香港)、博时国际和嘉实国际三家基金公司的比特币和以太坊现货ETF,并陆续披露了…

TypeScript学习日志-第二十三天(装饰器Decorator)

装饰器Decorator 一、类装饰器 ClassDecorator 其中返回的 target 是 Http 的构造函数,有了构造函数就不会去破坏其自身原有的结构,当我们 Http 里面有多个属性或者方法的,当是我们不想看或者改变它,这时候可以在构造函数中增加即…