您现在的位置是:首页 > 编程 > 

SQL Bug:一个意想不到的错误

2025-07-22 06:00:11
SQL Bug:一个意想不到的错误 在日常的开发工作中,我们经常会遇到两张表需要通过某个字段进行联表查询的场景。然而,如果两张表的关联字段数据类型不一致,例如一张表的字段类型是BIGIT,另一张是VARCHAR,可能会导致查询结果出现重复数据的问题。  问题最初没有暴露出来,因为分页查询的前几页没有出现重复,只有在后续的页面才逐渐显现。因为代码中实体类中类型是一致,所以数据库中类型就没有刻意去

SQL Bug:一个意想不到的错误

在日常的开发工作中,我们经常会遇到两张表需要通过某个字段进行联表查询的场景。然而,如果两张表的关联字段数据类型不一致,例如一张表的字段类型是BIGIT,另一张是VARCHAR,可能会导致查询结果出现重复数据的问题。

  问题最初没有暴露出来,因为分页查询的前几页没有出现重复,只有在后续的页面才逐渐显现。因为代码中实体类中类型是一致,所以数据库中类型就没有刻意去看,这也太坑爹了

一、问题描述

  两个表之间的关联关系是一对一(1:1),但是连表查询后会有重复数据。

举例

  • 表1的表结构和数据
代码语言:javascript代码运行次数:0运行复制
create table manager_user
(
    id          bigint       not null comment '用户ID'
        primary key,
    user_name   varchar(128) not null comment '用户名称',
    user_mobile varchar(2)  null comment '手机号码'
)
    comment '后管用户表';
在这里插入图片描述
  • 表2的表结构和数据
代码语言:javascript代码运行次数:0运行复制
create table manager_user_role
(
    id      bigint      not null comment 'id'
        primary key,
    user_id varchar(2) not null comment '用户ID',
    role_id bigint      not null comment '角id'
)
    comment '用户角映射关系';
在这里插入图片描述
  • 在关联关系一对一的前提下,连表查询,出现重复数据
代码语言:javascript代码运行次数:0运行复制
SELECT *
FROM manager_user
         LEFT JOI manager_user_role
                   O manager_user_role.user_id = manager_user.id
  • 可以明显看出匹配错乱了,李四id为尾号225,但是把关联表尾号227的数据也匹配上了
在这里插入图片描述

二、问题分析

隐式类型转换的不确定性

  • 数据库可能会将varchar类型的字符串转换为bigint类型进行比较,而在转换过程中,如果字符串不能正确转换为数值,可能会出现问题
  • 另外,即使字符串可以转换为数值,也可能会出现精度损失或错误的转换结果,从而导致部分数据重复

三、解决方案

方式一:修改表结构统一数据类型,这是最直接的解决方式

方式二:可以使用明确的类型转换来避免隐式类型转换的不确定性

代码语言:javascript代码运行次数:0运行复制
SELECT *
FROM manager_user
       LEFT JOI manager_user_role 
           O manager_user_role.user_id = CAST(manager_user.id as char);

四、总结

在进行SQL连表查询时,关联字段的数据类型不匹配可能会导致各种问题,如部分数据重复。为了避免这些问题,我们应该尽量保持关联字段的数据类型一致,并在进行类型转换时仔细检查数据内容,确保转换的正确性

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-20,如有侵权请联系 cloudcommunity@tencent 删除字符串sqlbug数据数据类型

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1163122.html

相关标签:无
上传时间: 2025-07-20 21:22:28
留言与评论(共有 19 条评论)
本站网友 郑州地一大道
8分钟前 发表
即使字符串可以转换为数值
本站网友 交通牡丹卡
21分钟前 发表
这是最直接的解决方式方式二:可以使用明确的类型转换来避免隐式类型转换的不确定性代码语言:javascript代码运行次数:0运行复制SELECT * FROM manager_user LEFT JOI manager_user_role O manager_user_role.user_id = CAST(manager_user.id as char);四
本站网友 早期孕妇食谱
22分钟前 发表
但是把关联表尾号227的数据也匹配上了在这里插入图片描述二
本站网友 注射用唑来膦酸
23分钟前 发表
分享自作者个人站点/博客
本站网友 水样女人
14分钟前 发表
李四id为尾号225
本站网友 我只会吹头
21分钟前 发表
确保转换的正确性本文参与 腾讯云自媒体同步曝光计划
本站网友 受精卵着床
4分钟前 发表
SQL Bug:一个意想不到的错误 在日常的开发工作中
本站网友 中美医院
30分钟前 发表
这也太坑爹了一
本站网友 recycler
3分钟前 发表
user_mobile varchar(2) null comment '手机号码' ) comment '后管用户表';在这里插入图片描述表2的表结构和数据代码语言:javascript代码运行次数:0运行复制create table manager_user_role ( id bigint not null comment 'id' primary key
本站网友 隐藏进程
29分钟前 发表
但是把关联表尾号227的数据也匹配上了在这里插入图片描述二
本站网友 肉林芝
11分钟前 发表
user_id varchar(2) not null comment '用户ID'
本站网友 yamei
21分钟前 发表
问题分析 隐式类型转换的不确定性 数据库可能会将varchar类型的字符串转换为bigint类型进行比较
本站网友 石化租房
20分钟前 发表
因为代码中实体类中类型是一致
本站网友 鸟鸣山更幽
0秒前 发表
李四id为尾号225
本站网友 显示器驱动程序已停止响应
10分钟前 发表
问题描述  两个表之间的关联关系是一对一(1
本站网友 宿迁电影院
17分钟前 发表
问题分析 隐式类型转换的不确定性 数据库可能会将varchar类型的字符串转换为bigint类型进行比较
本站网友 灯心草的功效与作用
20分钟前 发表
解决方案方式一:修改表结构统一数据类型
本站网友 滨州学校
14分钟前 发表
李四id为尾号225