Oracle sqlldr导入乱码问题分析和解决
情况描述
- oracle 数据库字符集编码是:GBK的;
- 当前操作系统是linux redhat;
- 被导入的csv文件的字符集也是:GBK,文件换行符是unix格式;
- 使用sqlldr可以成功导入到表,但csv中字段有中文的在表中显示“?????”这种“乱码”。
情况分析
一般来说,脚本和导入文件没问题的话,多数是环境的问题,查了一下资料,跟当前执行导入脚本的账户的环境变量有关。
先查一下oracle的字符集:
select name, value$ from sys.props$ where name like 'NLS%';
可知,语言是:
NLS_LANGUAGE AMERICAN
NLS的全称是:National Language Support。
再查 一下,当前操作账户的语言和字符集环境:
echo $NLS_LANG
结果居然是空的!(不要怪我,系统不是我安装滴)
好吧。。。。
不废话了,我再查一下,GBK对应的NLS的设置应该是:AMERICAN_AMERICA.ZHS16GBK。
问题解决思路
问题原因找到了,根据经验要解决此问题,要么改当前账户的环境变量,要么改sqlldr的ctl文件,为了省事,我选择后者,ctl修改的片断如下:
Load data
CHARACTERSET ZHS16GBK --即本行代码为设置字符集
INFILE 'TBL_SIS_PACKAGE.csv'
APPEND INTO TABLE TBL_SIS_PACKAGE
最后,再次执行sqlldr的脚本,数据正常入库且中文无乱码。
Good luck!