在达梦数据库中进行数据库Insert时可能会遇到如下错误:
java.sql.SQLException: Record length exceed maximum size
上面是程序的返回,如果是在数据库中操作,则直接返回:
记录超长
这里的原因其实也很简单,就是数据不能插入到block中了。数据最后都是被存储到数据页上的,而数据页的大小是在数据库实例初始化时设定的,默认是8K,去掉文件头部、事务槽等空间后,实际保存一条数据的空间在4K左右,如果数据超过这个阙值就会报错‘记录超长’。
这里的限制于和页大小有关,一条记录的长度除大字段类型(clob、blob)以外不能超过页大小的一半, 执行以下语句看看页大小:
select page();
以varchar2类型为例,最大的长度如下表:
跟进以上的分析说明,这里有3中解决方法:
达梦数据库的页大小只能在实例创建的时候才能制定,所以如果要修改page大小,那么需要新建实例,并把数据迁移过来。
另外还有一点需要需要,达梦数据库默认是8k的block size,但是实际生产推荐使用32k的block size,据说是达梦对32k的page 做了相关的优化。
相关操作参考我之前的博客:
DM7 达梦数据库 通过dminit 创建 并 注册 数据库实例
https://www.cndba.cn/dave/article/3580
因为生产环境重建实例有时候并不现实,所以可以对单表的解决。 即直接修改问题表的存储结构,将表的【启用超长记录】打开, 打开后,一条记录的页的存储空间就不会受限制。但是需要注意的是长字符串的字段上若存在索引,插入或更新时索引依然可能会报错‘记录超长’或者在创建索引的时候都可能会报错‘记录超长’。
使用SQL修改表存储属性:
alter table table_name enable using long row ;
在DMManager中修改:
直接将报错列的类型修改成Text。