Oracle数据库支持多种字符集, 目标是为了方便支持全球的各种不同语言, 但在实际生活中则常给我们带来麻烦, 98年刚出道时在老板兼师傅的指导下犯过一次错, 将所有的中文都导出成了问号, 最后客户请了一个学五笔输入法的班来重新纠正那些问号, 因此需要特别加注意, 一般情况下不允许在导出时进行字符集转换.

    准确的方法是, 导出工具所用的NLS_LANG设置和数据库的字符集一致就对了, 在exp的日志输出中可以看到以下信息:

Connected to: Oracle Database 10g Enterprise Edition ……
With the Partitioning, OLAP and Data Mining options
Export done in UTF8 character set and AL16UTF16 NCHAR character set

    当不一致时, 日志输出中会告诉你exp的NLS_LANG的设置, 以及数据库所用的字符集, 在下例中, NLS_LANG中用了US7ASCII, 服务器端则是UTF8.

Connected to: Oracle Database 10g Enterprise Edition ……
With the Partitioning, OLAP and Data Mining options
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses UTF8 character set (possible charset conversion)

    当不一致时, 如果导表时也导出了统计信息, 则还会得到以下错误信息.

EXP-00091: Exporting questionable statistics.
EXP-00091: Exporting questionable statistics.
Export terminated successfully with warnings.

    外面流传可以改dmp文件中的字符集标识, 但如果在导出时已经发生了字符集转换, 就没用了. 我也改过, 那是将数据从US7ASCII的库导到GBK库中时做的, NLS_LANG设成US7ASCII进行导出, 再改dmp文件中的字符集标识, 然后NLS_LANG设成ZHS16GBK再进行导入.