Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: BIGINT UNSIGNED value is out of range in '`tmp_field` - `tmp_field`'
这个错误通常是由于在数据库中执行某些数学运算时,结果超出了 BIGINT UNSIGNED 数据类型的范围而引起的。在 MySQL 中,BIGINT UNSIGNED 类型表示的是一个 64 位无符号整数,范围是从 0 到 18446744073709551615。
当执行类似 “tmp_field - tmp_field” 这样的数学运算时,如果被减数小于减数,就会导致结果为负数,而 BIGINT UNSIGNED 类型不支持负数,因此会出现 “value is out of range” 错误。
检查报错的查询sql,查询中使用了 结束时间-开始时间,但是由于系统重启没有及时同步时间,导致数据库中数据存在结束时间小于开始时间。
-- 问题sql
SELECT
*
FROM
l_test
WHERE
end_time - start_time < 60;
-- 修改后
SELECT
*
FROM
l_test
WHERE
end_time < start_time + 60;
还可以考虑以下方法
1、确保减法操作不会导致负数:在进行减法操作前,可以先判断被减数是否大于减数,避免出现负数结果。可以使用 CASE 表达式或 IF 函数来进行条件判断。
SELECT
IF
( `end_time` > `start_time`, `end_time` - `start_time`, 0 ) AS result
FROM
l_test;
2、可以尝试使用 SIGNED 类型进行转换,以便能够处理可能存在的负数情况。
SELECT
CAST( `end_time` AS SIGNED ) - CAST( `start_time` AS SIGNED ) AS result
FROM
l_test;