受公司一同事的问题启发, 源库是US7ASCII, 目标库是UTF8, 如何将数据从源库拷贝到目标库. 这个问题其实是一个比较复杂的问题, 当源库客户端的字符集同为US7ASCII, 如果输入中文, 则数据保存的是ZHS16GBK字符集, 如果输入日文, 则为日文字符集, 同理, 如果输入的是韩文, 则是韩文字符集, 也就是同一个表中存放的文本, 可能有三种不同的字符集. 如果我们在记录层面无法确定是哪个国家的文字, 要导入到UTF8的目标库, 还是一件很复杂的事情.

    如果US7ASCII数据库中的数据全部都是中文, 还是可以实现这一转换的, 转换的方法为, 用US7ASCII的客户端字符集取出数据, 然后以ZHS16GBK的客户端设置去导入到UTF8的目标库, 就可以完成从US7ASCII到UTF8的转换.

    一般情况下只有一种字符集, 为了解决这个类型的数据迁移问题, 可以给DataCopy或DataSync的源库和目标库设定不同的客户端字符集. 其中, 连接源库的客户端字符集由NLS_LANG决定, 而连接目标库的客户端字符集可以由以下两个参数来控制.

* charset = character set name of the target database.
* ncharset= national character set name of the target database.

    如果没有设置这两个参数, 则源库和目标库的连接都使用NLS_LANG中的设置, 使用同一种字符集. 现在如果我们要将US7ASCII数据库中的中文数据导入到UTF8的目标库中, 可以使用以下命令.

datacopy user1=… user2=… table=… charset=ZHS16GBK ncharset=AL32UTF8

    如果那位朋友有这个需求, 可以测试一下, 这样的转换能不能准确无误地工作, 希望这个功能, 可以为不同字符集的数据迁移带来方便.