解决oracle中文显示乱码有三层地方需要调整或者修改
第一层:操作系统层
locale -a
查看操作系统是否安装了中文字符集
2.设置用户的中文字符集
查看到linux安装了中文字符集,那么oracle用户下面要设置中文字符集
原为LANG=“en_US.UTF-8”
vim /etc/locale.conf # centos7是这个配置文件,有的linux是这个配置文件/etc/sysconfig/i18nLANG="zh_CN.UTF-8"
我的redhat 6.4是在/etc/sysconfig/i18n中设置。
上面的那种方法设置完后,系统所有用户的字符集都是UTF-8。也可以改单个用户的字符集,就是在用户下的环境变量配置文件里面.bashrc里面直接,但本人没有进行验证
export LANG="zh_CN.UTF-8"
然后查看操作系统的字符集,进入Oracle用户查看
env |grep LANGNLS_LANG=AMERICAN_AMERICA.AL32UTF8LANG=zh_CN.UTF-8
可以看到NLS_LANG中是AL32UTF8
第二层:数据库层
在数据库里面查询数据库和实例的字符集
select * from nls_database_parameters;select * from nls_instance_parameters;PARAMETER VALUE------------------------------ --------------------NLS_RDBMS_VERSION 12.2.0.1.0NLS_NCHAR_CONV_EXCP FALSENLS_LENGTH_SEMANTICS BYTENLS_COMP BINARYNLS_DUAL_CURRENCY $NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZRNLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZRNLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AMNLS_TIME_FORMATHH.MI.SSXFF AMNLS_SORT BINARYNLS_DATE_LANGUAGE AMERICANNLS_DATE_FORMATDD-MON-RRNLS_CALENDAR GREGORIANNLS_NUMERIC_CHARACTERS .,NLS_NCHAR_CHARACTERSET AL16UTF16NLS_CHARACTERSETAL32UTF8NLS_ISO_CURRENCYAMERICANLS_CURRENCY $NLS_TERRITORY AMERICANLS_LANGUAGE AMERICAN20 rows selected.
可以看到数据库的字符集是 AL32UTF8;保持服务端和客户端的字符集一致即可
这样之后,那我们打开sqlplus 查询中文,一般就能正常显示了,如果还是乱码,那就新insert一个中文看看,因为修改之前的字符编码跟修改之后的不一致。
若需要进行数据库字符集修改,进行以下操作
1、启动监听并打开数据库
2、查看Oracle数据库字符集
select userenv('language') from dual;
4.修改Oracle数据库字符集
SQL> shutdown immediate;SQL> startup mount;SQL> alter system enable restricted session;SQL> alter system set job_queue_processes=0;SQL> alter system set aq_tm_processes=0;sql> alter database open;SQL> alter database character set AL32UTF8 #你要的编码集,比如ZHS16GBK,AL32UTF8SQL> shutdown immediate;SQL> startup;
这样就将数据库字符集修改过来了
第三层:plsql层(windows层)
重要的PLSQL层,由于我们是通过PLSQL导入Excel数据的,所以首先要保证这部分是中文。
首先修改Windows的环境变量
右击我的电脑,点击“属性”–>“环境变量”,在系统变量中新建键值分别为NLS_LANG:SIMPLIFIED CHINESE_CHINA.AL32UTF8
然后在PLSQL中进行修改
在PLSQL中点击菜单 tools后点击preferences 在弹出的设置窗口中找到 Appearance下的language,选择设置简体中文即可。
经过以上三层的修改,在PLSQL中进行Excel数据导入后,查询正常。