在自己的电脑(Windows 7 简体中文)上编写的插入数据的SQL脚本(内容大致如下)
放到Oracle数据库(Linux系统)执行后发现插入的中文乱码
使用PL/SQL Developer连接查询也是乱码
解决方法:
自己的电脑的字符集是
安装的Oracle客户端也显示是SIMPLIFIED CHINESE_CHINA.ZHS16GBK
(打开注册表,'开始'-'运行' 输入'regedit'-确定。找到如下路径,
HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/KEY_OraClient12Home1)
使用UltraEdit工具打开脚本也可以看到脚本字符集
所以在自己的电脑的脚本保存时默认是ZHS16GBK.
查询数据库的字符集
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.AL32UTF8
数据库的字符集是AMERICAN_AMERICA.AL32UTF8
所以数据中的中文插入后乱码
可以使用如下方法:
1--------在PL/SQL Developer工具上执行插入语句。但是数据量过多时执行速度很慢很慢
2--------在数据库服务器(Linux系统)上为数据库指定的Linux用户(这里是oracle)
暂时修改NLS_LANG环境变量export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
[oracle@oracle11gr203db ~]$ export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
[oracle@oracle11gr203db ~]$ sqlplus scott/scott
SQL*Plus: Release 11.2.0.3.0 Production on Tue Mar 21 17:58:27 2017
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
--------------------------------------------------------------------------------
AMERICAN_AMERICA.AL32UTF8
此时执行字符集为ZHS16GBK的脚本并提交数据。但是服务器上查询是需要将 NLS_LANG环境变量修改为:export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"
[oracle@oracle11gr203db ~]$ export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"
[oracle@oracle11gr203db ~]$ echo $NLS_LANG
AMERICAN_AMERICA.AL32UTF8
[oracle@oracle11gr203db ~]$
也可以使用PL/SQL Developer等其他工具远程查询.
3--------在自己的电脑上将脚本保存是选utf-8字符集,这里我使用UltraEdit工具保存脚本
然后将脚本放到服务器上并将 NLS_LANG环境变量修改为:
export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"
此时执行字符集为UTF8的脚本并提交数据。
在服务器上查询是需要将 NLS_LANG环境变量修改为:
export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"
[oracle@oracle11gr203db ~]$ export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"
[oracle@oracle11gr203db ~]$ echo $NLS_LANG
AMERICAN_AMERICA.AL32UTF8
[oracle@oracle11gr203db ~]$
同样,也可以使用PL/SQL Developer等其他工具远程查询.
注意:这里在保存脚本为utf-8字符集是有两种,一般建议选择无BOM的,
有BOM的脚本第一行会报错,无BOM的不会出现(仅限安装在Linux上的oracle数据库)
所以一定要声明NLS_LANG环境变量(一般与操作系统有关)
相关命令
AMERICAN_AMERICA.AL32UTF8
echo $NLS_LANG
export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"
export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
sqlplus scott/scott
参考文档
查看windows 系统字符集
http://jingyan.baidu.com/article/3c343ff70e42e70d3679635b.html
Linux系统下Oracle执行SQL脚本后中文出现乱码解决方法
http://blog.csdn.net/zzs0829/article/details/7410264
utf-8和utf-8 +bom 有什么区别?
https://zhidao.baidu.com/question/1988203804217274627.html
如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)
http://blog.sina.com.cn/s/blog_4f4f9e6f01019ru7.html