ORACLE数据库IMP逻辑导入出现ORA-00910的处理案例

教程发布:风哥 教程分类:ITPUX技术网 更新日期:2022-02-12 浏览学习:757

ORACLE IMP ORA-00910 出错处理案例

环境 源库AIX+9.2.0.4 新库solaris+9.2.0.8
导入出错提示是以下部分:
IMP-00017: following statement failed with ORACLE error 910:
"CREATE TABLE "T_CSL_DYNAITEMDATAENTRY" ("FID" VARCHAR2(44) NOT NULL ENABLE,"
" "FITEMDATAID" VARCHAR2(44) NOT NULL ENABLE, "FITEMID" VARCHAR2(44) NOT NUL"
"L ENABLE, "FKEYNUMBER" NVARCHAR2(500) NOT NULL ENABLE, "FKEYNAME" NVARCHAR2"
"(500) NOT NULL ENABLE, "FDATAELEMENT" NUMBER(10, 0) NOT NULL ENABLE, "FVALU"
"ETYPE" NUMBER(10, 0) NOT NULL ENABLE, "FYEAR" NUMBER(10, 0) NOT NULL ENABLE"
", "FPERIOD" NUMBER(10, 0) NOT NULL ENABLE, "FVALUE" NUMBER(21, 6), "FDYNAIT"
"EMTYPE" NUMBER(10, 0), "FTEXTVALUE" NVARCHAR2(4000), "FGRADENUMBER" VARCHAR"
"2(80)) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 15728"
"640 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "EAS_D_CH"
"INAMOBILE_STANDARD" LOGGING NOCOMPRESS"
IMP-00003: ORACLE error 910 encountered
ORA-00910: specified length too long for its datatype
经过详细检查导入日志只有要NVARCHAR2(4000)的字段类型表都导入不了,而且nvarchar2存储的数据大部分是中文。
在原库查询
SQL> select name,VALUE$ from props$ where name in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
NAME VALUE$
------------------------------ --------------------------------------------------------------------------------
NLS_CHARACTERSET ZHS16GBK
NLS_NCHAR_CHARACTERSET UTF8
在新库查询
SQL> select name,VALUE$ from props$ where name in ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
NAME VALUE$
------------------------------ --------------------------------------------------------------------------------
NLS_CHARACTERSET ZHS16GBK
NLS_NCHAR_CHARACTERSET AL16UTF16
可以看出原库和新库的国家字符集不同
通过查资料,得到以下答案
在创建数据库时,我们可以指定字符集(CHARACTER SET)和国家字符集(NATIONAL CHARACTER SET)。
字符集用来存储:
CHAR, VARCHAR2, CLOB, LONG等类型数据
用来标示诸如表名、列名以及PL/SQL变量等
SQL和PL/SQL程序单元等
国家字符集用以存储:
NCHAR, NVARCHAR2, NCLOB等类型数据
utf-8和utf-16他们两的字符范围是完全相同的。
utf-8和utf-16是unicode的两种编码实现,都能完全表现unicode。
不同之处就在于:
utf8 对于ansi 字符 (英文字母,数字,符号) 用一个 byte ,但对中文字符就要 3个byte才行,甚至有要4个byte的汉字。
而一般 utf16 对 一般的 字符包括汉字都是2bytes。
所以原来存储的字段值更大,而新库存储的字段值更小,导致nvarchar2类型的数据导入出错。

解决方法:
1.更改国家字符集由AL16UTF16为UTF8
$ sqlplus ‘/ as sysdba’
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT EXCLUSIVE;
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL> ALTER DATABASE OPEN;
SQL> ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;
SQL> SHUTDOWN IMMED
用这种方法更改后,通过测试导入一个有nvarchar2字段类型表的数据,会出现乱码,而且直接这样修改国家字符集会存在风险,所以放弃。

2.重建数据库,选择国家字符集为UTF8,测试导入一个有nvarchar2字段类型表的数据正常。

本文标签:
网站声明:本文由风哥整理发布,转载请保留此段声明,本站所有内容将不对其使用后果做任何承诺,请读者谨慎使用!
【上一篇】
【下一篇】