暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL SQL报错-BIGINT UNSIGNED value is out of range

原创 冯刚 2022-10-12
3981

前言

此案例为超过unsigned字段类型限制报错。具体为两个字段包含unsined类型,且相减为负数时的报错。

1 环境信息

数据库信息:RDS MySQL5.7.30

2 错误描述

开发执行查询的时候,

select a.c1,
       a.c2,
       (a.c1-a.c2) as `数量`
from test.t1 a
where a.create_time >= '2022-2-1 00:00:00'
  and a.create_time < '2022-2-15 00:00:00';

报错如下:

org.jkiss.dbeaver.model.sql.DBSQLException: SQL 错误 [1690] [22001]: Data truncation: BIGINT UNSIGNED value is out of range in '(`test`.`a`.`c1` - `test`.`a`.`c2`)'

3 排查

初步搜了一下报错,说是unsigned类型字段进行上述运算的时候,如果结果是负数,就会报错。下面验证

 select a.c1,
	a.c2
from test.t1 a
where a.create_time >= '2022-2-1 00:00:00'
  and a.create_time < '2022-2-15 00:00:00'
  and and a.c1 < a.c2;
  c1          |      c2             |
--------------+---------------------+
            -3|                    0|
           -15|                    0|
            -5|                    0|

该段时间内,有3条数据,a.c1-a.c2会出现负数。

而选择别的时间段,a.c1-a.c2不会出现负数的时候,则不会报错。

4 原因

确认是上面原因,数据里面,会有a.c1 小于 a.c2的情况。

5 解决方案

和开发确认,

1、是否是数据异常导致的;如果这几条数据有问题,是否可以修改数据,而不用修改查询语句;

2、如果数据不能修改,只能修改查询语句(但需要业务确认结果准确性);

经确认,需要改写SQL。推荐SQL改写如下:

select a.c1,
       a.c2,
       (a.c1-a.c2) as `数量`
from test.t1 a
where a.create_time >= '2022-2-1 00:00:00'
  and a.create_time < '2022-2-15 00:00:00'
  and a.c1 > a.c2;

业务反馈没有问题了。

6 后续

经过半年,业务反馈又出现相同报错,提供的查询语句如下:

select a.c1,
       a.c2,
       (a.c1-a.c2) as `数量`
from test.t1 a
where a.create_time >= '2022-2-1 00:00:00'
  and a.create_time < '2022-2-15 00:00:00'
  and (a.c1 - a.c2) > 0;

发现上次改写语句的时候,where条件里面没有写成a.c1 > a.c2,写成了(a.c1 - a.c2) > 0,怀疑是where里的这个原因。把and (a.c1 - a.c2) > 0;注释掉,不会报错,确认是这个原因。

改成a.c1 > a.c2就好了。

最后修改时间:2022-10-17 11:04:35
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论