我有一个的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.   

    http://topic.csdn.net/t/20030710/20/2014176.html 
      

  2.   

    创建一个新实例,字符集是ZHS16GBK的,把数据imp进去.
    然后在两个数据库之间建立dblink,通过copy命令把数据传到目的数据库中.
      

  3.   

    你在导入的时候要保证3者之间的字符集一致客户端
    在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文件导入目标数据库(字符集为中文)
    肯定能帮到你
      

  4.   


    导入的时候端字符集设置为ZHS16GBK,导完后再改为WE8ISO8859P1即可,这样那此工具的中文会显示正常.
      

  5.   

    简单点,每个导入和导出的环节(服务器端和客户端)均使用SIMPLIFIED CHINESE_CHINA.WE8ISO8859P1 字符集。