Oracle SPOOL和SQL Loader的字符集转换问题(原创)
最近做Oracle的数据迁移,将数据从一个数据库导入到另外一个数据,自己用Java编写了程序。思路是首先用 Oracle的 sql plus将数据SPOOL到数据文件中,然后再用Oracle 的SQL Loader将数据从数据文件加载到表中。这个过程是一个表对一个表(当然Oracle SQL Loader支持一表对多表),程序采用多线程实现。
但是测试的时候发现由于源库的字符集和目的库不一样,因此,无论怎样选字段分隔符都不能成功导入数据。在查了好多资料后,才最终解决。因此,总结出以下几点:
1、在数据导出时,一定要使客户端字符集与源Oracle 服务器字符集一致,这点可以修改注册表 NLS_LANG参数,或者增加NLS_LANG环境变量
2、在数据导入时,客户端字符集设置可以不变,但在Sqlldr的控制文件中一定要有这行:CHARACTERSET 目的Oracle服务器字符集
3、sqlldr的控制文件格式类似:
LOAD DATA
CHARACTERSET 目的Oracle服务器字符集
INFILE 。。。。。。。。。。
4、查看目的数据库中导入的数据时请将客户端字符集设置为与目的数据库相同,不然看到的还是乱码。
5、如果两者字符集一致,可以采用数据链路(DATA LINK)的方式进行数据的迁移。
这个小问题困扰了我好几天。大家如果转载请注明出处,或者加上本文链接,算是对我的一点点鼓励吧 :)