为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8.4
【操作系统】:Linux localhost.localdomain 4.19.91-26.an8.x86_64 #1 SMP Tue May 24 13:10:09 CST 2022 x86_64 x86_64 x86_64 GNU/Linux
【CPU】:
【问题描述】*:
通过MyBatis 插入同样的数据,发现达梦数据库的精度丢失了,而Oracle保存正常,目前发现大于10位会丢,大致的一个SQLMERGE INTO 语句,Java 属性是Double,然后从MyBatis 执行的日志都是带精度的,然后保存到达梦发现如图三,精度丢失了
具体SQL如下,PID可以认为是主键
MERGE
INTO
hdc_dwd.dwd_patient_predict_emr_drg T1
USING (SELECT '1132192lhdsyq' PID,
3673.1840000000007 HOSPITAL_DRG_COST_AVG
FROM dual) T
ON (
T1.PID = T.PID
)
WHEN MATCHED THEN
UPDATE
SET T1.HOSPITAL_DRG_COST_AVG = T.HOSPITAL_DRG_COST_AVG,
WHEN NOT MATCHED THEN INSERT (
PID,
HOSPITAL_DRG_COST_AVG
)
VALUES
(
T.PID,
T.HOSPITAL_DRG_COST_AVG
);
有人遇到过这个问题吗?有什么修复方案吗?
连接和驱动版本如下
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver8</artifactId>
<version>8.1.3.162</version>
</dependency>
求大佬看看,这个大概是什么原因呀?
表DDL可以拿出来看看,还有你的图3结果集是其他的工具查询显示的,是不是经过了转换,可以从DM管理工具查询确认一下。
语句也可以直接在DM管理工具中执行后,对比程序执行的结果看一下。

以下请参考
在使用达梦数据库时遇到Double类型数值精度丢失的问题确实值得关注。从你提供的信息来看,这个问题很可能是由于数据类型的兼容性设置或者JDBC驱动的特定行为导致的。
关于原因分析:
Oracle与DM的数据类型差异:虽然两者都是基于SQL标准的关系型数据库,但它们在处理浮点数默认的行为可能不同。例如,在Oracle中Double精度值(如3673.1840000000007)通常能被准确存储,但在DM中可能会因为类型兼容性设置或驱动程序的转换逻辑而发生截断。
JDBC驱动参数配置:如果你使用的是MyBatis与达梦数据库集成,可能需要调整数据类型的精度控制。例如,在插入时明确指定要保留的小数位数和总精度(通过PreparedStatement的setScale方法)可能会有所帮助。
表结构定义问题:检查目标表中相关列的数据类型是否支持足够高的精度。如果列被定义为FLOAT或REAL类型,可能无法存储小数点后超过一定数量的数字而不损失精度。
解决方案建议:
希望这些建议能帮助你解决Double类型数值精度丢失的问题。如果还需要进一步的帮助,请提供更多的细节信息。
如果以上能为您解决问题,请点击“设为最佳答案”并确认,谢谢!