磐维数据库(PanWeiDB)是由中国移动基于中国本土开源数据库openGauss打造的自研数据库产品,主要面向ICT基础设施。它具有高性能、高可靠性、高安全性和高兼容性的特点,能够支持集中式、分布式、云原生、一体机等多种应用场景。目前,磐维数据库已在中国移动的多个省(区、市)公司及专业公司部署应用。
案例背景
本文将分享江西移动公司在数据库国产化过程中的<多表关联的查询SQL报错解决思路>
环境描述
- OS版本:BCLinux for Euler 21.10 (LTS-SP2)
- DB版本:panweidb 3.0.1
- 兼容模式:B模式
- 数据库架构:单机模式
问题描述
业务在某个查询sql中使用了表关联,在关联两个表时查询没有问题,但是关联三个表后发生了报错:
invalid input syntax bigint:“test'”

问题分析
-
根据错误提示,先查看关联表中的字段是否存在“bigint”,发现相关表没有这个字段。
-
既然表没有bigint这个字段,那么说明在执行过程中被转换了,通过执行计划查看执行的情况,发现有一个字段被转成bigint,原表的类型是varchar。

-
查看表数据发现该表有个值是‘test’,不符合执行计划中的bigint类型,导致报错。

问题结论
关联的表中某个字段存在与数据库转化类型不符的数据导致查询失败。
解决方法
1、修改sql中的查询条件,如下:
原语句:SELECT count(0) FROM t_packet_meeting pm LEFT JOIN t_project p ON (p.`id` = pm.project_id) LEFT JOIN t_base_dict bd ON (bd.item_value = pm.meeting_purpose_id AND bd.type_value = 30) WHERE pm.common_status = 1 AND pm.project_id = '0020120709d74c47bb1f3c4d27034acc';
修改:把bd.type_value = 30 改成 bd.type_value = '30'即可
SELECT count(0) FROM t_packet_meeting pm LEFT JOIN t_project p ON (p.`id` = pm.project_id) LEFT JOIN t_base_dict bd ON (bd.item_value = pm.meeting_purpose_id AND bd.type_value = '30') WHERE pm.common_status = 1 AND pm.project_id = '0020120709d74c47bb1f3c4d27034acc';
修改后的执行计划:

2、把表数据删除(该字段其他数据均为数字,只有一条为“test”)

总结
遇到此类问题时,首先从错误信息入手,检查相关的表结构和数据是否有对应报错的信息,接着检查一下执行计划,查看该sql是如何执行的,是否存在某个字段的类型被转换成其他类型。通过这两步检查,基本能找到问题关键点。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




