注册
DM8之记录超长报错-2665
技术分享/ 文章详情 /

DM8之记录超长报错-2665

www_heql 2024/03/08 864 0 0

1 问题描述

在有些应用场景进行DML操作时会报-2665:记录超长报错。如下,
image.png
我们根据字面意思大概知道是数据的长度超长了。
进一步解释,记录指表中一行数据,也就是一行数据的总长度超出了限制范围。

2 解决思路

1> 分析插入数据是否合理,进行限制,避免超过限定长度。
2> 数据库部署时考虑业务不周全,选择了不合理的页大小。需要重新初始化数据库,设置更大的页大小,再对新库进行导入数据恢复作业。
3> 修改字符超长的列的类型为大字段类型。
4> 对报错的表开启超长记录,让表可以插入长的数据。仅对字符类型列有效,且影响数据库部分性能。

3 规则讲解

数据库表中的每一行是一条记录。在DM中,除了HUGE表,其他的表都是在数据页中按记录存储数据的。也就是说,记录是存储在数据页中的,记录并不是DM数据库的存储单位,页才是。由于记录不能跨页存储,这样记录的长度就受到数据页大小的限制。数据页中还包含了页头控制信息等空间,因此DM规定每条记录的总长度不能超过页面大小的一半。

页大小是初始化数据库时的参数,设置后无法修改,会影响字符(如 char/varchar)的实际最大长度和每条记录的最大长度。

基表中,若没有指定 ‘USING LONG ROW’ 存储选项时,插入VARCHAR数据类型的实际最大存储长度由数据库页面大小决定;如果指定了’USING LONG ROW’存储选项,则插入 VARCHAR 数据类型的长度不受数据库页面大小限制。VARCHAR 类型在表达式计算中的长度上限不受页面大小限制,为 32767。

基于以上限制,在规划数据库、应用业务时要设置合理的页大小。另外,在建表设置类型长度时要设置合理,有时并不是列可以设置多大就一定可以存储多长的数据。

4 测试环境

DB:1-3-100-2024.01.29-216864-20081-SEC
OS:麒麟V10
CPU:Intel x86
页大小:32K
编码:UTF-8
注:以字节长度为单位

5 测试过程

说明:数据库设置页大小32K,也就是说默认情况下,每行的长度不能超过16384字节。

测试1,建表时,如果没有指定字符的长度,默认为8188。
image.png
image.png

测试2,建表时,字符的长度可以设置最大为32767。
image.png
image.png

测试3,虽然字符的长度可以设置为32767,但是只能存储数据页的一半长度16179。
插入30000,报错,
image.png
插入16780,报错,
image.png
插入16179,正常。
image.png

测试4,建表test02,创建两列字符类型,看各自可以存储多少。
建表,
image.png
一起插入c1,c2,长度总和超16179,报错记录超长,
image.png
结论:表的每行总长度不能超过16180。

测试5,开启表test02的超长记录,并尝试插入超过16180长度的数据。
开启表test02的超长记录,
image.png
单行总长可以超过16179,
image.png
单列长度可以超过16179,
image.png
单列最大长度可以达到设定的32767,
image.png

5 总结

1、在规划数据库、应用业务时要设置合理的页大小。设置太小,存储长度不够,设置太大,空间浪费。
2、在建表时,类型长度时要设置合理,长度设置建议够用、最小原则。
3、列属性的长度并不是可以设置多大就一定可以存储多长的数据,要综合考虑所有列的长度总和。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服