ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ORACLE IMP ORA-00910 出错处理案例

ORACLE IMP ORA-00910 出错处理案例

原创 Linux操作系统 作者:paulyibinyi 时间:2009-05-02 09:43:14 0 删除 编辑

环境 源库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字段类型表的数据正常。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7199859/viewspace-592423/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
学习数据库

注册时间:2007-12-11

  • 博文量
    902
  • 访问量
    6551815