源windows数据库10G,字符集WE8DEC,查看数据库字符集参数后,exp时在cmd中设置了set NLS_LANG=AMERICAN_AMERICA.WE8DEC,仅特别设置了direct=y的参数,后导出,导出无报错,无字符集转换。目标linux数据库11G,字符集AL32UTF8,imp时设置了export  NLS_LANG=AMERICAN_AMERICA.WE8DEC,仅特别设置了ignore=y的参数,导入仅有IMP-00041: Warning: object created with compilation warnings和ORA-12899: value too large for column "SCHEMA_NAME"."TABLE_NAME"."COLUMN_NAME" (actual: <xx>, maximum: <yy>)的问题,已通过修改column长度解决。导入过程仅有一次字符集转换。但是imp后不设置NLS_LANG的情况下select中文字段,发现为乱码,多个?号;设置export NLS_LANG=AMERICAN_AMERICA.WE8DEC后select发现能显示中文,但个别字为繁体乱码。请问下大家,
1、非超级子集关系,exp、imp必定出现中文字符乱码的情况么?有没有办法解决中文乱码问题?
2、windows数据库在cmd中set NLS_LANG设置环境变量和通过注册表设置变量效果相同么?不是因为此原因才导致的中文乱码吧?
3、为何在不设置NLS_LANG的情况下select中文出现英文字符乱码,而设置NLS_LANG后,能显示成中文字符乱码?4、如果EXP/IMP跨字符集迁移数据有问题的话,还有什么方法可行?对于迁移一个有近百G,几百张表的schema来说。我查阅metalink,有DMU和、csscan/csalter、export/import等方法,请问有实际做过的么?乱码数据库迁移

解决方案 »

  1.   

    我处理过从10g的US7ASCII倒到10g的ZHS16GBK,主要方法是修改export生成的dmp文件中的字符集标识位。你可以试试看。可以参考这篇文档:
    http://blog.csdn.net/tianlesoftware/article/details/4915223
    不过我测试时字符集标识位的位置是在第8行(UNIX下为第9行)的第3、4个字节。
      

  2.   

    谢谢cowboyhn,我看了下推荐的文档其中有以下说明。5.2 修改dmp文件字符集
    上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。我感觉这种方法是否能放在生产环境中使用还有待验证。我目前查阅metalink按照oracle官方推荐的办法,使用expdp/impdp + emp/imp +DMU进行了字符集转换测试,目前样表测试结果发现字符集能正确转换,无乱码,有些许能够自己解决的小问题(如OEM可能需要重建等)。如果这个办法schema级别测试不通过,我再考虑其他办法。
      

  3.   

    有条件做下全数据的转换测试和应用测试,CLOB类型能否正常转换(我当时碰到问题)。