2007年8月17日星期五

数据库导入导出乱码问题


项目数据需要清理,DBA将数据按照用户导出发过了。导入数据的时候,发现数据库中文全部变成问号。上网找了一下资料,发现原来是数据库字符集不兼容。导入数据库的字符集WE8ISO8859P9,而导出数据库的字符集为ZHS16GBK。

第一个想法就是更改导入数据库的字符集,通过如下语句:ALTER DATABASE CHARACTER SET ZHS16GBK进行更改,系统提示“ORA-12712 new character set must be a superset of old character set”。原来使用这个语句还需要考虑更改的字符集与原来数据库的字符集兼容。Metalink Note:119164.1上定义了不同字符集的兼容关系。

只有重新建立一个库,设定字符集为ZHS16GBK/AL16UTF16。Imp的时候,系统显示的日志为:
import done in ZHS16GBK character set and AL16UTF16 NCHAR character set
export client uses ZHS16CGB231280 character set (possible charset conversion)
export server uses ZHS16GBK NCHAR character set (possible ncharset conversion)

可以看到DBA导出的时候客户端字符集为“ZHS16CGB231280”,导出的数据库字符集为“ZHS16GBK”,这两个字符集也不完全兼容,以后导出的时候需要注意更改客户端字符集。导入的数据库的字符集为“ZHS16GBK”。导入完成之后,没有发现乱码问题。

总结:
1. 导入导出过程中涉及4个字符集,需要保证字符集的兼容性,才可能避免汉字乱码问题。
源数据库字符集
Export过程中用户会话字符集(通过NLS_LANG设定)
Import过程中用户会话字符集(通过NLS_LANG设定)
目标数据库字符集
2. 字符集兼容可以通过Metalink Note:119164.1查询。
3. 同时,在安装数据库的时候,应该根据业务需求选定好字符集,而不是采用安装过程的默认设置。

参考:
网上非常好的一篇文章:http://silverw0396.javaeye.com/blog/90554

没有评论: