Caused by: org.postgresql.util.PSQLException: 错误: 数字字段溢出
详细:精度为10,范围是8的字段必须四舍五入到小于10^2的绝对值
我的数据库字段类型是 NUMERIC(10, 8) 入库抛出的异常
实体类 采用的是 BigDecimal
后端在接收前端的参数
问题分析,问题出在 startPortLat
字段的数值超出了 NUMERIC(10, 8)
的范围。NUMERIC(10, 8)
表示总共有 10 位数字,其中小数部分有 8 位。这意味着整数部分最多只能有 2 位数字。
分析
字段定义:
NUMERIC(10, 8)
:总共有 10 位数字,其中 8 位是小数部分,2 位是整数部分。- 例如,
12.34567890
是一个有效的值,但123.4567890
就不是,因为整数部分超过了 2 位。
输入值:
35.48833333
:这个值的整数部分是 35,超过了 2 位,因此会导致溢出。
调整数据库字段类型:
- 如果你需要存储更大的整数部分,可以考虑增加
NUMERIC
的总长度和小数部分长度。例如,可以将字段类型改为NUMERIC(12, 8)
,这样整数部分可以有 4 位,小数部分有 8 位。
解决方案:调整数据库字段类型
ALTER TABLE your_table_name
ALTER COLUMN start_port_lat TYPE NUMERIC(12, 8);
调整输入值
在插入数据前,可以对输入值进行检查和处理:
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
BigDecimal input = new BigDecimal("35.48833333");
BigDecimal roundedValue = input.setScale(8, RoundingMode.HALF_UP);
System.out.println("Rounded Value: " + roundedValue);
}
}
完整示例
假设你的表名为 design_voyage
,你可以执行以下 SQL 语句来调整字段类型:
ALTER TABLE design_voyage
ALTER COLUMN start_port_lat TYPE NUMERIC(12, 8);