S05003
错误代码
S05003
报错信息
DECIMAL math overflow RefId:S05003
错误原因
DECIMAL 类型数据的内部实则使用有符号整型进行存储,详细如下:
- DECIMAL32 使用
int32_t
表示。 - DECIMAL64 使用
int64_t
表示。 - DECIMAL128 使用
int128_t
表示。
对于 N bits 格式的有符号整型数据,其可以表示的数值范围为 [-1 * 2 ^ (N-1), 2 ^ (N-1) - 1]。如果 DECIMAL 内部的整型数据在参与运算时,其结果超出该可表示范围,就会报这个错误。比如:
- DECIMAL 数据参与计算(计算函数,SQL);
- 将其他类型的数据转换成 DECIMAL;
- 不同 DECIMAL 类型、不同 scale 的 DECIMAL 数据相互转换。
解决办法
- 使用可表示范围更大的 DECIMAL 类型,比如 DECIMAL128。
- 适当降低 DECIMAL 的参数 scale。比如,若数据只需要精确到小数点后 5 位,那么建议将 scale 调整为 5。
- 使用 FLOAT/DOUBLE 替换 DECIMAL 类型。