« 不同字符集的数据迁移 »
Tools » http://www.anysql.net/tools/datacopy-datasync-nls-lang.html 2010-04-10受公司一同事的问题启发, 源库是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
如果那位朋友有这个需求, 可以测试一下, 这样的转换能不能准确无误地工作, 希望这个功能, 可以为不同字符集的数据迁移带来方便.


OCI怎么在客户端指定非NLS_LANG的设置呢?
这样做还没有正式测试过呢, 也不确定能行.
已在本机测试过, 这个方法可行.
好的 谢谢!我试试,楼总的开发速度惊人哇!
UTF8的库能容纳的长度好像要少一些,有办法没呢?
这个要增加字段长度了,或者在建表时用CHAR为单位,默认是以BYTE为单位的。例如:
CREATE TABLE UTF8_TEST (COL1 VARCHAR2(8 CHAR));
这样在UTF8的库中建时,真实的字段长度会是24字节.