踩坑系列—SqlServer批量新增BigDecimal精度问题<foreach collection="list" item="item" separator="," index="index"></foreach>
1 2 3 | Insert into ALU_KINGDEE_POWDER_STORE(org_code,verify_date,material_code,material_name,brand,storage,type,weight) VALUES (?,?,?,?,?,?,?,?) , (?,?,?,?,?,?,?,?) ; 11:51:55 [qtp2014552931-33] DEBUG c.f.c.m.k.A.insertList - ==> Parameters: 14201(String), 2020-12-16T09:18:13.873(String), 10010201010276(String), FA1475(String), 0(String), --(String), 1(String), 60.000000000000(BigDecimal), 14201(String), 2020-12-16T09:20:41.953(String), 10010201010276(String), FA1475(String), 0(String), ---(String), 2(String), 40.000000000000(BigDecimal) 11:51:55 [qtp2014552931-33] DEBUG c.f.c.m.k.A.insertList - <== Updates: 2 |
1 2 3 4 5 | insert into alu_bar_kingdee_weight(cinvcode,stockno,stock_weight,org,stock_num)values <foreach collection= "list" item= "item" separator= "," index= "index" > (#{item.cinvcode},#{item.stockNo},#{item.stockWeight},#{item.org},#{item.stockNum}) </foreach> ; |
场景:
SqlServer数据库表A有个字段column1类型为decimal(12,5),javaBean对应的BigDecimal,批量新增数据。
执行insert前打印了数据,column1对应的值都是正常的,但是执行insert后,表中column1的值有些正确有些不正确。
分析:
因为一开始只是发现了个别数据应该是2位小数结果被四舍五入保留了1位小数,就以为是哪里出了问题被统一设置了保留1位小数,但是看了代码和数据库精度都没有特殊设置,而且打印出的数据也是正常的,肯定是在新增数据库这一步出了问题。
于是把所有数据拉出来核对,发现了不对劲。
批量新增的数据有以下几种:
(1)column1对应的值小数位都是一样,比如都是2位
insert A(column1,column2) values(10.28,xxx),(11.24,yyy),(12.51,zzz);
最终数据库的值都是正常的 说明并没有被统一设置保留1位小数,因为2位也新增成功了
(2)column1对应的值小数位不一样,比如有的1位,有的2位
insert A(column1,column2) values(10.28,xxx),(11.2,yyy),(12.51,zzz);
最终数据库的值有些正确,有些不正确,具体是这样的:
column1 column2
10.30000 xxx
11.20000 yyy
12.50000 zzz
10.28变成了10.3 12.51变成了12.5
- 1
网上查资料有一篇说了这个问题:批量插入数据时,如果插入的数据精度不统一,最终入库的数据精度统一按最低的精度入库
地址如下:https://www.jianshu.com/p/845c1cd10bd9
观察我出问题的数据,果然是这样的,小数位一样的时候没问题,小数位不一样的时候都按最低精度比如1位四舍五入了
解决:
在java代码中将精度设置成统一的,如
new BigDecimal(“10.28”).setScale(5),
new BigDecimal("(11.2").setScale(5),
new BigDecimal(“12.51”).setScale(5),
再次测试批量新增,数据正常:
column1 column2
10.28000 xxx
11.20000 yyy
12.51000 zzz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~