现象描述
新部署一套环境,需要将预置的数据导入数据库中,以SQL文件的形式导入。
但是导入的结果在检查时发现汉字全都是乱码,如下图:
而且在导入数据的时候也发现很多问题:
问题解决
首先肯定这是因为字符集的原因导致的,因为Oracle所有涉及到汉字乱码的问题都能归结为字符集的问题。
接下来检查Oracle自己的字符集:
这里有两个几个重要的信息:NLS_LANGUAGE
NLS_TERRITORY
NLS_CHRACTERSET
接下来在Linux的terminal里查询NLS_LANG这个环境变量:
echo $NLS_LANG
发现结果是空,此时需要把这个值修改成上面Oracle查询出来的值,其具体要求是:
export NLS_LANG=NLS_LANGUAGE_NLS_TERRITORY.NLS_CHRACTERSET
具体到这个例子里就应该是这样的命令:
export NLS_LANG='AMERICAN_AMERICA.UTF8'
需要注意的是,这个设置是session级别的
现在可以重复刚才导入数据的过程,就会正常的导入数据,并能查询出正确的结果了。
如果此时在Plsql Developer或者SQLPLUS中查询出来的汉字还是乱码,就需要检查一下LANG变量是否正确设置:
export LANG=en_US.UTF-8
一般情况下,这样设置,就能让保存为UTF8格式的中文文本被正确识别并导入。
结束
之前写过一个MySQL导入的案例:有财君:你所看到的,还真不一定是真实的zhuanlan.zhihu.com
生活在非英语国家,有时候这些问题是难以避免的,看见汉字,一定要谨慎。