问题:
10g数据库导入到11g数据库时,部分表的字段会出现ORA-12899的报错,如下:
IMP-00019: 由于 ORACLE 错误 12899 而拒绝行
IMP-00003: 遇到 ORACLE 错误 12899
ORA-12899: 列 "WHNAPROJECT"."COST_BUDGET_MANAGER"."BUDGETCONTENT" 的值太大 (实际值: 2536, 最大值: 2000)
分析:
10g数据库的字符集于11g数据库的默认字符集不一致,导致在转换时,字段值会超过设定值,因此需要在导入前将字符集统一。
解决:
在将10g数据库导入到11g数据库之前,修改11g数据库字符集为 ZHS16GBK:
SQL> conn / as sysdba;
SQL> shutdown immediate;
SQL> startup mount;
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 character set ZHS16GBK;
SQL> alter shutdown immedite;
SQL> startup;
以上代码执行过程中出现
ERROR at line 1:
ORA-12712: new character set must be a superset of old character set
提示我们的字符集:新字符集必须为旧字符集的超集,这时我们可以跳过超集的检查做更改,INTERNAL_USE为强制转换的意思:
SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
Database altered.
SQL> select * from v$nls_parameters;
相关知识:
1、 查看全部字符集: select name, value$ from props$ where name like '%NLS%';
2、查看服务端的字符集: select userenv('language') from dual;
HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/KEY_OraDb11g_home1/ 中右边框中的 NLS_LANG 键所对应的值为即当前 Oracle 客户端使用的字符集,如 SIMPLIFIED CHINESE_CHINA.ZHS16GBK,再如:american_america.al32utf8
3、查看服务端字符集: SQL> select * from nls_database_parameters;
4、查看客户端字符集: SQL> select * from nls_instance_parameters;
5、查看 session 字符集: SQL> select * from nls_session_parameters;