数据库中导入报错记录超长怎么办
这篇文章给大家分享的是有关数据库中导入报错记录超长怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
现象描述
我们在从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个,就会报错字符串截断。字符串截断和数据溢出,是一个类型的错误,数据溢出就是非字符串类型,精度不足。
感谢各位的阅读!关于“数据库中导入报错记录超长怎么办”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341