问题解决:使用Mybatis Plus的Mapper插入达梦数据库报“数据溢出”错误

前言

使用Mybatis Plus的Mapper插入达梦数据库报"数据溢出"错误

文章目录

问题描述

  1. 在进行批量插入中,抛出异常为数据溢出
    • 插入方法:this.baseMapper.insertBatchSomeColumn()
    • 抛出异常:数据溢出
  2. 对失败的数据进行循环,尝试使用单个插入的方法,同样抛出异常为数据溢出
    • 插入方法:this.baseMapper.insert
    • 抛出异常:数据溢出

错误日志输出

txt 复制代码
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)

排查过程

  1. 使用异常断点:Breakpoints-> + Java Exception Breakpoints

  2. 找到调用栈中的执行方法:插入预处理执行的语句

  3. 发现语句中,如果实体字段定义为BigDecimal,其预处理的值是字符串格式

  4. 到达梦窗口工具-DM管理工具中进行测试验证

    1. 新增测试表:t_simple,包含字段height,类型及精度为DEC(4,2)

      sql 复制代码
      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 '姓名';
    2. 插入的值为字符串,出现报错:-6108: 字符串截断

      sql 复制代码
      insert into t_simple (height) values ('175.23');


    3. 插入的值为数字类型,报错:-6170: 列xxx精度超出定义

  5. 使用Mybatis Plus的BaseMapper.insert插入的时候,当实体字段为BigDemical类型的,会转换成字符串,最后报错:达梦数据库异常,数据溢出

最终解决办法

备注:标度为小数点后的位数,如DEC(4,2)包含了2个小数,则整数有4-2

  1. 增大表字段类型的精度

    sql 复制代码
    alter table "t_simple" modify "height" DEC(5, 2);
  2. 测试插入值为字符串:插入成功

    sql 复制代码
    insert into t_simple (id,height) values (1,'175.23');
  3. 测试插入值为数字类型:插入成功

    sql 复制代码
    insert into t_simple (id,height) values (1,175.23);
相关推荐
其实防守也摸鱼6 小时前
每天一个知识点——RCE漏洞
运维·服务器·数据库·windows·安全·github·漏洞
TDengine (老段)6 小时前
TDengine 常见问题 TOP2
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
笃行3506 小时前
数据迁移工具 KDMS 帮我把一本糊涂账算清了
数据库
笃行3507 小时前
SQLServer数据库迁移实录:十年老系统搬上 KingbaseES,T-SQL 基本没重写
数据库
落魄大学生之流水线上谋生计8 小时前
Java并发核心机制详解:线程池、CAS、AQS、锁升级
java·开发语言·数据库
Wang's Blog8 小时前
Java框架快速入门: Spring Security+OAuth2之邮件验证码发送(SMTP与API方式)
java·数据库·spring
砚底藏山河9 小时前
容错重试与指数退避:网络抖动手抖不再丢数据(魔码量化实战 #04)
java·数据库·python·金融
蓝速科技10 小时前
会议室门牌触控预约选型与落地实战指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
蓝速科技10 小时前
企业展厅数字人导览效果提升与选型实战指南丨蓝速科技
大数据·运维·数据库·人工智能·科技·microsoft
奔跑吧树袋熊10 小时前
多租户隔离该做到哪一层:从连接池到 ORM 的取舍
开发语言·数据库·oracle·系统架构