遇到的问题:
org.springframework.dao.DataIntegrityViolationException:
### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation:
Data truncation: Out of range value for column 'capital_interest_tax' at row 1
如下图所示:
原因分析:
大致意思就是我们输入的位数太多了超出了范围,大致意思你支持八位整数,你输入了超过范围了。
字段名 | Java 类型 | MySQL 类型 | 说明 |
---|---|---|---|
capitalInterestTax | BigDecimal | DECIMAL(10,2) | 数据库最多支持整数部分 8 位,小数 2 位,共 10 位 |
如果传入了一个值如:123456789.12
,总位数为 11 位,就会导致 超出 MySQL 的 DECIMAL 定义限制,从而触发 MysqlDataTruncation
异常。
解决方案:
✅ 方法一:调整数据库字段类型
如果你预期这个字段值会比较大,可以扩大 MySQL 中该字段的精度,比如:
或者使用SQL语句也行。
例如:ALTER TABLE wk_crm_pc
MODIFY COLUMN capital_interest_tax DECIMAL(18, 2);
🚨 注意:改字段前一定要评估数据范围和业务需求,避免盲目扩大字段导致不必要的数据浪费。
✅ 方法二:检查 Java 实体类和传入数据
-
检查是否有不合理的大值传入(如计算错误、字段赋值异常)
-
使用断点或日志打印
capitalInterestTax
的值 -
确保它不会超过数据库定义的范围
如果你害怕后续在不小心输入的多了,报错可以添加前置校验:不过18位整数一般很少超过了。
if (capitalInterestTax.compareTo(new BigDecimal("99999999.99")) > 0) {
throw new IllegalArgumentException("资本利息税超出最大值");
}
总结
这个问题本质上是 数据类型约束 导致的错误,是 Java 和 MySQL 联调中的常见问题之一。建议在开发初期就统一定义好字段精度规范,并在关键字段上增加校验逻辑,避免因数据异常影响业务流程。