我有一个的dmp文件,是从字符集ZHS16GBK的oracle10g的数据库中导出的,现在要导入的oracle10g,字符集是WE8ISO8859P1的数据库中,直接导入后数据中的中文乱码,查了一些资料做了以下测试,
1,将客户端(客户端是windows2003)的字符集改为WE8ISO8859P1,从客户端导入,(修改注册表项NLS_LANG)
2,从服务器端导入(服务器系统是rethat5,系统变量NLS_LANG=american_america.WE8ISO8859P1)。
注:服务器端NLS_LANG设成其他的字符集就登录不了数据库,用select userenv('language') from dual查看字符集 是:SIMPLIFIED CHINESE_CHINA.WE8ISO8859P1
3,修改dmp文件第2,3字节为001f,然后导入,
注:原来是0354,通过select nls_charset_name(to_number('0354','xxxx')) from dual查看是ZHS16GBK字符集,
通过select to_char(nls_charset_id('WE8ISO8859P1'), 'xxxx') from dual查的WE8ISO8859P1字符集id是001f
4,修改服务器字符集,提示信息:new character set must be a superset of old character set,我理解是WE8ISO8859P1是ZHS16GBK的超集,字符集只能从子集改成超集,不能从超集改成子集,
以上几种方法导入后中文还是乱码,请哪位高手指点指点,另问一下客户端字符集是ZHS16GBK时imp提示信息中文显示正常,改为WE8ISO8859P1时提示信息中文乱码,我服务器的字符集是WE8ISO8859P1,怎样既让客户端字符集与服务器端保持一致,又可以使那些工具的中文显示正常
1,将客户端(客户端是windows2003)的字符集改为WE8ISO8859P1,从客户端导入,(修改注册表项NLS_LANG)
2,从服务器端导入(服务器系统是rethat5,系统变量NLS_LANG=american_america.WE8ISO8859P1)。
注:服务器端NLS_LANG设成其他的字符集就登录不了数据库,用select userenv('language') from dual查看字符集 是:SIMPLIFIED CHINESE_CHINA.WE8ISO8859P1
3,修改dmp文件第2,3字节为001f,然后导入,
注:原来是0354,通过select nls_charset_name(to_number('0354','xxxx')) from dual查看是ZHS16GBK字符集,
通过select to_char(nls_charset_id('WE8ISO8859P1'), 'xxxx') from dual查的WE8ISO8859P1字符集id是001f
4,修改服务器字符集,提示信息:new character set must be a superset of old character set,我理解是WE8ISO8859P1是ZHS16GBK的超集,字符集只能从子集改成超集,不能从超集改成子集,
以上几种方法导入后中文还是乱码,请哪位高手指点指点,另问一下客户端字符集是ZHS16GBK时imp提示信息中文显示正常,改为WE8ISO8859P1时提示信息中文乱码,我服务器的字符集是WE8ISO8859P1,怎样既让客户端字符集与服务器端保持一致,又可以使那些工具的中文显示正常
然后在两个数据库之间建立dblink,通过copy命令把数据传到目的数据库中.
在windows平台下,就是注册表里面相应OracleHome的NLS_LANG。还可以在dos窗口里面自己设置,比如:
set nls_lang=AMERICAN_AMERICA.ZHS16GBK
这样就只影响这个窗口里面的环境变量。服务端
select * from nls_database_parameters;DMP(这字符集在LINUX可以通过语句查询,但是WINDOWS就只能打开DMP看了)
dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,比如只有几M或几十M,可以用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集:
select nls_charset_name(to_number('0354','xxxx')) from dual; 可行的操作方法:
注意:请严格按照指定步骤进行!操作前请先对数据库做整库备份。 1、在原数据库(字符集为英文)执行sqlplus,连接sys用户,修改字符集参数,然后退出。 SQL> connect sys/sys as sysdba;
update props$ set value$ = 'ZHS16GBK' where name = 'NLS_CHARACTERSET';
update props$ set value$ = 'ZHS16GBK' where name = 'NLS_NCHAR_CHARACTERSET';
commit;
SQL> quit; 2、执行svrmgrl,关闭并重新开启Oracle数据库
connect sys/sys as sysdba;
shutdown immediate;
startup mount;
alter system enable restricted session;
alter system set job_queue_process=0;
alter database open;
alter database character set ZHS16GBK;
shutdown immediate;
exit; 3、执行regedit,将键值HKEY_LOCAL_MACHINE\Software\ORACLE\NLS_LANG
由 AMERICAN_AMERICA.WE8ISO8859P1
转换为 SIMPLIFIED CHINESE_CHINA.ZHS16GBK 4、执行exp导出数据 5、执行regedit将键值HKEY_LOCAL_MACHINE\Software\ORACLE\NLS_LANG
由 SIMPLIFIED CHINESE_CHINA.ZHS16GBK
恢复为 AMERICAN_AMERICA.WE8ISO8859P1 6、执行sqlplus,连接sys用户,恢复字符集参数,然后退出。 connect sys/******; (口令一般为"manager")
update props$ set value$ = 'WE8ISO8859P1' where name = 'NLS_CHARACTERSET';
update props$ set value$ = 'WE8ISO8859P1' where name='NLS_NCHAR_CHARACTERSET';
commit;
SQL> quit; 7、重复步骤2,关闭并重新开启Oracle数据库 8、将导出的dmp文件导入目标数据库(字符集为中文)
肯定能帮到你
导入的时候端字符集设置为ZHS16GBK,导完后再改为WE8ISO8859P1即可,这样那此工具的中文会显示正常.