MySQL数据库中不同数据类型字段关联后结果居然有这么大差异?

news2024/11/26 4:21:19

点击上方蓝字关注我

859a29d6c09ad62e7e960e20ee967bc3.png

在数据库的世界里,数据的连接操作是至关重要的。但在处理关联表的字段的数据类型不同时,得到的结果经常会出乎预料。

1.  案例

1.1 数据库中先创建表及数据

-- 创建tb1
CREATE TABLE tb1 (
  id BIGINT NOT NULL PRIMARY KEY, NAME VARCHAR (20)
);




INSERT INTO tb1 (id, NAME)
VALUES
  (1459066134882947196, 'na1'), (1459066134882947172, 'cccb'), (1459066134882947163, 'tttttttn'), (1459066134882947198, 'acqada');
 
--  创建tb2
CREATE TABLE tb2 (
  id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, pid VARCHAR (20), c1 VARCHAR (10)
);


INSERT INTO tb2 (pid, c1)
VALUES
  ('1459066134882947196', 'cs'), (1459066134882947197, 'tt');

tb1 的id表为bigint,tb2表pid字段类型为varchar

1.2  进行左连接查询

SELECT  a.id,b.pid 
FROM  tb1 a  LEFT JOIN tb2 b 
ON a.id=b.`pid`
WHERE a.id =1459066134882947196

查询结果如下:

ba3fbd71080d9d4e82031253a04579b0.png

结果为非预期,因为2个表的关联字段的内容并不相同

1.3  使用内连接

SELECT  a.id,b.pid 
FROM  tb1 a   JOIN tb2 b 
ON a.id=b.`pid`
WHERE a.id =1459066134882947196

使用内连接后,结果也不正确

364a9e65c2526ce406543d6326de7251.png

1.4  不加where条件的左连接

SELECT  a.id,b.pid 
FROM  tb1 a   LEFT JOIN tb2 b 
ON a.id=b.`pid`

查询结果如下:

fd8149f089363af882b3f2c6fc9fbd08.png

关联后确实是非预期的结果

1.5 不加where条件的内连接

SELECT  a.id,b.pid 
FROM  tb1 a    JOIN tb2 b 
ON a.id=b.`pid`

查询结果为:b6023dd18358457cc23bf95cda36479b.png

此时不加where条件的内连接的结果却是正确的

2. 解决方案

解决此问题的方法主要是解决两个关联字段的类型不同的问题,可以有2种方式

2.1  显式类型转换

在关联的时候显式地进行字段类型转换,例如:

SELECT  a.id,b.pid FROM  tb1 a LEFT JOIN tb2 b 
ON CAST(a.`id`  AS  CHAR)=b.`pid`
WHERE a.id=1459066134882947196

结果如下:661f87fde0d38ef7ea49010d97653094.png

此时结果正确。
内连接结果也正确

SELECT  a.id,b.pid 
FROM  tb1 a    JOIN tb2 b 
ON CAST(a.`id`  AS  CHAR)=b.`pid`
WHERE a.id =1459066134882947196

2.2 改变字段类型(推荐)
如果两张表的数据量较大,使用显式的字段类型转换(包括当前隐式字段类型转换)都将导致关联时不能使用索引,影响性能。因此建议在表设计时就将存在关联关系的字段类型设置为类型相同(字符类型时字符集及排序规则也一致)
例如:

ALTER TABLE  tb2 MODIFY pid BIGINT;

修改后再查询看一下结果:

SELECT  a.id,b.pid 
FROM  tb1 a   LEFT JOIN tb2 b 
ON a.`id`=b.`pid`
WHERE a.id =1459066134882947196

结果正确:

9a588ddf536d6b36326c0116cc424581.png

3. 小结

此情况的出现是因为两表的关联字段类型不同时进行字段类型转换导致。bigint与varchar转换过程中字段精度出现问题,实际超过int最大值的数据(2147483647,即2^31 - 1)的数据被截断为2^31 - 1处理,因为两表进行左关联时,存在异常。

从上面的过程中,也发现左连接过程与内连接的过程中的中间数据结果(1.4及1.5中)也不同。

a1313ae5cfa3d8a0b995e77bf8cbec99.png

往期精彩回顾

1.  MySQL高可用之MHA集群部署

2.  mysql8.0新增用户及加密规则修改的那些事

3.  比hive快10倍的大数据查询利器-- presto

4.  监控利器出鞘:Prometheus+Grafana监控MySQL、Redis数据库

5.  PostgreSQL主从复制--物理复制

6.  MySQL传统点位复制在线转为GTID模式复制

7.  MySQL敏感数据加密及解密

8.  MySQL数据备份及还原(一)

9.  MySQL数据备份及还原(二)

e32d3ba8c8ae1dba26743383880fbb54.png

扫码关注     

dca80c90839aa0030f8bf16306e487ee.jpeg

83bef9c34c8c34e950a67680f63381a1.png

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

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

相关文章

掌握Maven和SpringBoot的灵活性:定制化lib目录和依赖范围

前言 在开发基于Maven和SpringBoot的项目时,我们经常会使用第三方库来满足需求。然而,有时候我们需要更灵活地控制这些库的依赖范围和加载方式。本文将介绍如何使用Maven和SpringBoot实现定制化的lib目录和依赖范围。经过如下定制化后,打包执…

【C语言】备战校赛Day3

日期:11.3 星期五 L1-007 念数字 题目描述 输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ba 9: jiu 输入描述 输入在一行中给出一个…

Spring Data Redis + RabbitMQ - 基于 string + hash 实现缓存,计数(高内聚)

目录 一、Spring Data Redis 1.1、缓存功能(分析) 1.2、案例实现 一、Spring Data Redis 1.1、缓存功能(分析) hash 类型存储缓存相比于 string 类型就有更多的更合适的使用场景. 例如,我有以下这样一个 UserInfo 信息 假设这样一个场景就是:万一只想获取其中某一个…

MySQL第三讲·SQL boy的CRUD操作

你好,我是安然无虞。 文章目录 增删查改:如何操作表中的数据?添加数据插入数据记录插入查询结果 删除数据修改数据查询数据select|where|group by|havingfromorder bylimit 增删查改:如何操作表…

C++标准模板(STL)- 类型支持 (类型属性,is_literal_type,is_polymorphic,is_empty)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…

uniapp小程序刮刮乐抽奖

使用canvas画布画出刮刮乐要被刮的图片&#xff0c;使用移动清除画布。 当前代码封装为刮刮乐的组件&#xff1b; vue代码&#xff1a; <template><view class"page" v-if"merchantInfo.cdn_static"><image class"bg" :src&q…

强化学习的动态规划二

一、典型示例 考虑如下所示的44网格。 图1 非终端状态为S {1, 2, . . . , 14}。在每个状态下有四种可能的行为&#xff0c;A {up, down, right, left}&#xff0c;这些行为除了会将代理从网格上移走外&#xff0c;其他都会确定性地引起相应的状态转换。因此&#xff0c;例如&…

VMware产品收集日志方法汇总

概述 vCenter日志是一个用于存储与vSphere环境相关的各种活动、事件和警告的日志系统。通过收集并分析vCenter日志&#xff0c;管理员可以获得有关其虚拟化环境的重要洞察和故障排除信息。 vCenter日志由多个组件组成&#xff0c;包括vCenter Server、ESXi主机和其他vSphere组…

软件测试面试题:Web 端测试和 App 端测试有何不同

Web 端测试和 App 端测试是针对不同平台的上的应用进行测试&#xff0c;Web应用和App端的应用实现方式不同&#xff0c;测试时的侧重点也不一样。 今天这篇文章就来介绍下两者的不同之处以及测试时的侧重点。 Web 端应用和 App 端应用的区别 平台兼容性 Web 端应用可以在任何…

C#开源的一个能利用Windows通知栏背单词的软件 - ToastFish

前言 今天给大家推荐一个C#开源且免费的能利用Windows通知栏背单词的软件&#xff0c;可以让你在上班、上课等恶劣环境下安全隐蔽地背单词&#xff08;利用摸鱼时间背单词的软件&#xff09;&#xff1a;ToastFish。 操作系统要求 目前该软件只支持Windows10及以上系统&…

【C语言】C语言⻘蛙跳台阶问题--递归问题

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 本期专栏&#x1f525;&#xff1a;本期将分享一些猜数字小游戏怎么一步一步实现的 &#x1f308;作者寄语 &#x1f308;&#xff1a; 小菜鸟的力量不在于它的体型&#xff0c;而在于它内心…

Fourier分析导论——第3章——Fourier级数的收敛性(E.M. Stein R. Shakarchi)

第 3 章 Fourier级数的收敛性(Convergence of Fourier Series) The sine and cosine series, by which one can represent an arbitrary function in a given interval, enjoy among other remarkable properties that of being convergent. This property did not escape…

nodejs+vue网上商城系统系统-毕业设计

网上商城系统的架构设计通常分为三层&#xff1a;客户端层、应用层和数据层。 客户端层&#xff1a;客户端层是用户与系统交互的界面&#xff0c;包括Web页面、移动App等。用户可以通过客户端层进行商品浏览、下单、支付等操作。应用层&#xff1a;应用层是业务逻辑处理的中心&…

一个 不用氪金 也能让你变强的 VSCode 插件 Ai

哈喽,大家好 我是 彩色之外&#x1f468;&#x1f3fb;‍&#x1f4bb;。今天给大家推荐一款不用充钱也能让你变强的 vscode 插件 通义灵码&#xff08;TONGYI Lingma&#xff09;&#xff0c;可以称之为 Copilot 的替代甜品 &#x1f4aa; &#x1f440; 前期回顾 NPM- 滚动进…

BIOS开发笔记 – 显示

UEFI启动流程跑完前三阶段,UEFI环境的准备基本完成,到BDS阶段的任务就是准备引导OS。在此之前还需要使一些必要的硬件工作起来,比如键盘设备,屏幕等,怎么让屏幕工作呢?简单的说就是执行其相关的UEFI驱动。要注意一下的是,这里所说的驱动并不是屏幕的驱动,而是GPU的驱动…

Proteus仿真--1602LCD随机模拟显示乘法口诀(仿真文件+程序)

本文主要介绍基于51单片机的1602LCD随机模拟显示乘法口诀实验&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中上方主要是1602LCD液晶显示&#xff0c;使用方法点击左下方的按键开关实现不同的乘数切换&#xff0c;按照乘法表进行 仿真运行视频 Prot…

Android Studio的Java项目种运行main()的方法

首先随便在项目里面建一个类 public class TestSocket {public static void main(String[] args) {System.out.println("hahah");}}直接运行时会直接报错的 在项目的 .idea 添加代码 <option name"delegatedBuild" value"false"/> 再…

Centos7安装Elasticsearch和Kibana 记录(无坑版)

说明&#xff1a; 本文命令全部标红 elasticsearch使用版本是7.17.5 ik分词器也是7.17.5 虚拟机配置&#xff1a;2核4g centos版本&#xff1a;7 1、获取elasticsearch的安装包 下载&#xff1a;wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17…

《网络协议》01. 基本概念

title: 《网络协议》01. 基本概念 date: 2022-08-30 09:50:52 updated: 2023-11-04 07:28:52 categories: 学习记录&#xff1a;网络协议 excerpt: 互联网、网络互连模型&#xff08;OSI&#xff0c;TCP/IP&#xff09;、计算机通信基础。 comments: false tags: top_image: /i…

k-means算法c++实现

计算数据集中的元素与各个簇的中心的距离&#xff0c;将它赋给最近的簇&#xff0c;然后重新计算每个簇的平均值&#xff0c;再将元素按离平均值点最近的原则重新分配直到没有出现重新分配 该算法要事先给出k的值&#xff0c;即划分为几个簇。 vector<int> datoclu(dat…