前言
使用Mybatis Plus的Mapper插入达梦数据库报“数据溢出”错误
文章目录
- 前言
- 问题描述
- 错误日志输出
- 排查过程
- 最终解决办法
问题描述
- 在进行批量插入中,抛出异常为数据溢出
- 插入方法:this.baseMapper.insertBatchSomeColumn()
- 抛出异常:数据溢出
- 对失败的数据进行循环,尝试使用单个插入的方法,同样抛出异常为数据溢出
- 插入方法:this.baseMapper.insert
- 抛出异常:数据溢出
错误日志输出
Cause: dm.jdbc.driver.DMException: 数据溢出
; 数据溢出; nested exception is dm.jdbc.driver.DMException: 数据溢出
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79)
排查过程
-
使用异常断点:Breakpoints-> + Java Exception Breakpoints
-
找到调用栈中的执行方法:插入预处理执行的语句
-
发现语句中,如果实体字段定义为BigDecimal,其预处理的值是字符串格式
-
到达梦窗口工具-DM管理工具中进行测试验证
-
新增测试表:t_simple,包含字段height,类型及精度为DEC(4,2)
CREATE TABLE "t_simple" ( "id" BIGINT NOT NULL, "name" VARCHAR(50), "height" DEC(4,2), NOT CLUSTER PRIMARY KEY("id")) STORAGE(ON "MAIN", CLUSTERBTR) ; COMMENT ON TABLE "t_simple" IS '测试表'; COMMENT ON COLUMN "t_simple"."height" IS '身高(厘米)'; COMMENT ON COLUMN "t_simple"."id" IS 'ID'; COMMENT ON COLUMN "t_simple"."name" IS '姓名';
-
插入的值为字符串,出现报错:-6108: 字符串截断
insert into t_simple (height) values ('175.23');
- 插入的值为数字类型,报错:-6170: 列[xxx]精度超出定义
-
-
使用Mybatis Plus的BaseMapper.insert插入的时候,当实体字段为BigDemical类型的,会转换成字符串,最后报错:达梦数据库异常,数据溢出
最终解决办法
备注:标度为小数点后的位数,如DEC(4,2)包含了2个小数,则整数有4-2
-
增大表字段类型的精度
alter table "t_simple" modify "height" DEC(5, 2);
-
测试插入值为字符串:插入成功
insert into t_simple (id,height) values (1,'175.23');
-
测试插入值为数字类型:插入成功
insert into t_simple (id,height) values (1,175.23);