ORA-02374: conversion error loading table "PMP"."BASEINFO"
ORA-12899: value too large for column CSRC_INDUSTRY_TYPE_NAME (actual: 48, maximum: 40)
ORA-02372: data for row: CSRC_INDUSTRY_TYPE_NAME : 0X'BCC6CBE3BBFAA1A2CDA8D0C5BACDC6E4CBFBB5E7D7D3C9E8B1'
原因:源库与目标库的字符集不一致。
源库字符集:
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK
目标库字符集:
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.AL32UTF8
ZHS16GBK 和 AL32UTF8 对数据编码之后,存储格式不同,对于中文来讲,gbk存放一个汉字占用2个字节,utf8存放一个汉字占用3个字节,这样就会导致,比方说:原先GBK字符编码的数据库中的某张表中,存放中文的字段:colum001的类型是varchar 长度为200 ,并且该字段的大多数行的现有数据长度基本上在180个字节,那么该表导入UTF8编码的数据库中时,该字段原先存储的大多数180个字节的汉字,就需要180*3/2=270个字节左右的字符长度才能正常存放;而此时在执行impdp导入操作的时候,表结构是不会改变的,也就是原先的字段定义colum001的长度还是保持着200,因此在导入的时候,就会报错,出现上述错误信息。
处理方法:修改源库或目标库字符集,重新导出导入。可以参考修改字符集。
startup mount
alter database mount exclusive;
alter system enable restricted session;
alter system set job_queue_processes=0;
alter system set aq_tm_processes=0;
alter database open;
alter database character set zhs16gbk;
--ORA-12712: new character set must be a superset of old character set
--ORA-12712:新字符集必须为旧字符集的超集
alter database character set internal_use zhs16gbk;
--使用 internal_use 使oracle数据库绕过了子集与超集的校验.
shutdown immediate
startup