|  | 
| 感谢秦淮夜月兄不厌其烦的关注,但是我做了一些测试后,现在又有点不明白了。 
 情况是这样的,我设置NLS_LANG=AMERICAN_AMERICA.US7ASCII后,在SQL PLUS中向TT表中插入中文,保存和显示都没有问题。提交后,我退出SQL Plus,运行EXP导出了这个表。然后,我又设置NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK,然后我又做了一个EXP,这两份分别为不同是导出文件。
 
 然后,我用UltraEdit分别打开两个文件,发现两个字符集是不同,第一个是00 01后面一个是03 54。这一点秦淮夜月兄解释的很清楚了,是因为导出第一个文件前后端字符集是相同的,所以导出时没有做字符集转换,而后面一个前端是ZHS16GBK而后端是US7ASCII,所以做了从US7ASCII到ZHS16GBK的转换。
 
 但是,我发现,这两个文件后面的关于实际的库结构和数据的内容几乎是一模一样的,两个文件中的中文数据显示都是正常的。我分别删除了这两个文件的前129个字节的头后,用FC命令比较,结果如下:
 D:\temp>fc /b test_us7ascii_old.DMP test_zhs16gbk_old.DMP
 正在比较文件 test_us7ascii_old.DMP 和 TEST_ZHS16GBK_OLD.DMP
 00000811: 00 03
 00000812: 01 54
 00000813: 00 03
 00000814: 01 54
 000008E0: 33 36
 000008E1: 39 31
 000008E2: 37 33
 
 注意,关键的不同是00000811-00000814处是四个字节分别为两个不同字符集的代码即,第一个文件是00 01 00 01第二个文件是03 54 03 54。后面三个字节的不是个inst_scn号
 
 是不是由此可见,实际上,两种前端字符集下导出的文件其实主要部分是没有什么区别的,导出程序只是在导出文件中记录下了两种前端字符集,但数据还是原库中的字符原样没有作转换。
 或者,还是因为US7ASCII是ZHS16GBK的子集,所以才没有看出转换效果?
 
 如果确实是这样的,说明导出文件时并没有出错,错误的转换可能发生在导入时。
 
 我跟前面一样分别设置两种NLS_LANG后分别导入了两个导出文件(即我作了四次导入),但是发现导入后始终是乱码。
 
 秦淮夜月兄说:“做imp时,首先会比较exp的字符集B和当前前端字符集C是否相同,如果相同就执行imp,如果不同就首先进行转换,但能转换的前提是必须为单字节字符集,如果不是单字节字符集则会提示imp错误 ,这个也是为什么US7ASCII的dmp文件,不能在ZHS16GBK前端下imp的原因,因此只能强行修改。imp完成了dmp文件的转换后,就往库里插入,这个时候也要进行前后端字符集转换,如果字符集不同的话 ”
 
 但是从我测试的这个结果看来,是不是只要导出库是US7ASCII的,而导入库是ZHS16GBK的,无论导入时前端是那种字符集,都不能正常导入??
 
 看来直接导入时不行了,于是,我试图按照coolyl的方法,来做,
 1。确定你A机上的oracle用户的.profile文件中的NLS_LANG是US7ASCII,正常的导出所有数据。
 2。然后传到B机上,bin模式,然后在B机上设定好oracle用户的设定环境变量NLS_LANG=AMERICAN_AMERICA.US7ASCII
 以sys用户执行update props$ set values$='US7ASCII'
 where name='NLS_CHARACSET';
 3。正常的导入数据至ZHS16GBK的数据库中去,重新启动数据库,此时查看原来导入的数据应该已经中文了。
 
 我是Windows2000环境,我做了前面两步,第三步完成导入后,我作了Shutdown,然后,我再作Startup,这时问题就出来了:
 SQL> startup
 ORA-01031: insufficient privileges
 SQL>
 数据库启不来了,在导入之前,即update props$之前,是一点问题都没有的。我重启ORACLE的服务后,还是不能Startup。
 
 不知道我描述清楚了没有,希望大家仔细的看一看,然后再帮助分析一下我这次测试,能不能再做做总结。
 
 另个,关于前面提到的Nchar型中中文不正常的现象,也请大家关注。
 | 
 |