SpringBoot + MyBatis 报错 DataIntegrityViolationException:Data truncation: Out of range value for colu

遇到的问题:

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 类型说明
capitalInterestTaxBigDecimalDECIMAL(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 联调中的常见问题之一。建议在开发初期就统一定义好字段精度规范,并在关键字段上增加校验逻辑,避免因数据异常影响业务流程。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lucky GGBond

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值