共计 1621 个字符,预计需要花费 5 分钟才能阅读完成。
这篇文章给大家分享的是有关数据库中导入报错记录超长怎么办的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。
现象描述
我们在从 Oracle 或者其他数据库迁移数据到达梦数据库时(含使用 DTS),以及甚至平时,自己平时插入数据时,都可能碰到一个错误:
记录超长
碰到这种问题,我们怎么解决呢?
有三个方法
Ø 考虑更加合适的页大小(扩大),重新初始化实例后,重新导入数据
Ø 对表启用超长列存储功能,重新导入(或者插入)数据
Ø 把很长的 varchar 类型,考虑使用 CLOB 重建表后,再进行插入
处理方法
处理方法一:合适的页大小
在达梦数据库的底层存储中,关于【页】的详细情况,可以参考达梦官方手册(DBA 手册)的“章节 1.2.3 页”的介绍,这是达梦数据库的最小 IO 单元,类似于 Oracle 的块大小。
这里我们强调两个点:
1. 对于数据库实例的页大小,在数据库实例生命周期内,无法更改
2. 我们可以简单理解为,对于任何表的一行记录(不包括大字段),他们的总长达(字节大小),不能超过页大小的一半。(也就是所谓的行内数据,对于 LOB 字段,绝大部分都是行外数据)
这个计算非常严格,哪怕只超过一丁点,都会报错,例如:
Update set number_col=23.8 where number_col=23
这个 sql 语句,都有可能碰到 记录超长 的这个错误
3. 我们可选的页大小有:4KB、8KB、16KB
或者 32KB(默认为 8KB),该值在初始化实例时一次性指定,在数据库实例生命周期内,都不可更改。——对应的,一行记录(不包括大字段)的总长度,限制为 2、4、8、16 KB。
如何查看当前数据库实例的页大小:
`select page`
也就是说,如果我们的页大小是 8KB,插入数据报错“记录超长”,那么我们如果是 16KB 的实例,那么我们就不一定报错。且对于从 Oracle 进行迁移的实例,我们建议的页大小为 16KB。
处理方法二:启用超长列
超长列的功能就是针对这个问题实现的功能,这里讲如何启用超长列:
1. 图形化界面(manager 客户端)的方式
在模式下面,找到对应表,通过鼠标右键,打开菜单栏,通过菜单栏里的 存储选项à启用超长记录
完成设置
2. 通过 SQL 语句启用某个表的超长列
3. 在建表的时候,设置启用超长列的属性
处理方法三:使用大字段 CLOB,重建表
这个就是说的,本来我们一个表 test1(v1 int,…,vx int,vy varchar(8000)),插入数据时报错了,这个是我们:
Alter table test1 rename to test1_modify;
Create table test1(v1 int,…,vx int,vy clob);
Insert into test1 select * from test1_modify;commit;
然后,在进行相关操作,就不会碰到记录超长的问题了。
说明:
1. 这个方法可能会涉及到代码改造,比如对应字段在应用端的处理,varchar 类型和 CLOB 类型的处理方式存在区别。
2. CLOB 字段也可以直接 like,但和 CLOB_LIKE_MAX_LEN
该参数有关系,注意学习下达梦配置文件(dm.ini
参考 DBA 手册 正解 2.1.1):
CLOB_LIKE_MAX_LEN 默认值为 31 静态参数
LIKE 语句中 CLOB 类型的最大长度,单位 KB,有效值范围(8~102400)
备注:
– 要注意和字符串截断报错问题的区别,字符串截断,只是纯粹的精度不够,如 varchar(400), 是可以放 400 个字节的字符串,我们让它要放入 401 个,就会报错字符串截断。字符串截断和数据溢出,是一个类型的错误,数据溢出就是非字符串类型,精度不足。
感谢各位的阅读!关于“数据库中导入报错记录超长怎么办”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!