oracle ora 00910,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字段类型表的数据正常。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值