源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、非超级子集关系,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等方法,请问有实际做过的么?乱码数据库迁移
http://blog.csdn.net/tianlesoftware/article/details/4915223
不过我测试时字符集标识位的位置是在第8行(UNIX下为第9行)的第3、4个字节。
上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。我感觉这种方法是否能放在生产环境中使用还有待验证。我目前查阅metalink按照oracle官方推荐的办法,使用expdp/impdp + emp/imp +DMU进行了字符集转换测试,目前样表测试结果发现字符集能正确转换,无乱码,有些许能够自己解决的小问题(如OEM可能需要重建等)。如果这个办法schema级别测试不通过,我再考虑其他办法。