导入的dmp文件和目标数据库字符集不一样,会报导入数据错误。解决办法有两个:
一、把目标数据库的字符集改成与DMP文件的字符集一样
查看当前数据库字符集 :select userenv('language') from dual;
修改数据库字符集:
1. 关闭数据库
SQL>SHUTDOWN IMMEDIATE
2. 启动到Mount
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 DATABASE NATIONAL CHARACTER SET ZHS16GBK;
--如果是从子集到父集,需要使用INTERNAL_USE 参数,跳过超子集检测
SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL32UTF8;
然后重启即可
二、修改DMP文件的字符集
用UE编辑器打开,切换到16进制模式,修第一排第二个和第三个字符,0354为ZHS16GBK字符集,改了就可以了。可在数据库里查询对应字符集的编码如下:
select nls_charset_name(to_number('0354','xxxx')) from dual;
所以在导入或导出数据的时候,最好是看一下字符集,免得出问题,在安装数据库的时候,一定不要用默认值,自己手动选择一下这样更好;