https://blog.csdn.net/qq_27361945/article/details/81082176

关于字符、字节和编码问题,也可以从这篇文章中学习到,这里就不再赘述,这里只讲出现问题的场景、原因以及如何进行有效处理后解决乱码问题的

一、乱码出现场景和原因
1.乱码场景
刚安装好的oracle,本地和服务器字符集都是SIMPLIFIED CHINESE_CHINA.ZHS16GBK,
需要把服务器字符集修改为SIMPLIFIED CHINESE_CHINA.AL32UTF8。

之后通过sqlplus和PL/SQL查询出的中文都是乱码。
客户端和服务端统一SIMPLIFIED CHINESE_CHINA.AL32UTF8编码集后,
查询结果的中文正常显示,但无法通过中文进行查询。

2.乱码原因
简单来说,就是oracle客户端有一套编码集,为客户端操作系统字符集;服务端有两套,分别是服务端操作系统字符集和服务端数据库字符集。
我们只需要关心客户端编码集和服务端编码集。

比如:
我们客户端需要使用中文,需要设置成SIMPLIFIED CHINESE_CHINA.ZHS16GBK
而服务端可能要用AL32UTF8 作为字符集,

这里并不要求客户端和服务端的编码集一致,比如一条sql语句从客户端到服务端,会先通过GBK进行解码;
而解码后的内容传入到服务端后,再通过指定的字符集进行编码。

我在客户端编写了一条带中文的SQL语句,或者需要查询出的数据带中文,如果客户端没有使用中文的编码格式就无法正确进行解析,
从而造成乱码。

二、解决思路
1.先查看客户端和服务端的编码集
客户端:

 SELECT * FROM V$NLS_PARAMETERS;
1
服务端

SELECT * FROM NLS_DATABASE_PARAMETERS;
1
2. 修改客户端编码集
oralce中常用字符集:

AMERICAN_AMERICA.ZHS16GBK

SIMPLIFIED CHINESE_CHINA.ZHS16GBK

SIMPLIFIED CHINESE_CHINA.AL32UTF8

修改客户端编码集有两步:

打开注册表,找到路径:\HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOME,下的NLS_LANG修改为需要指定的字符集即可
在系统变量中新建:NLS_LANG = 编码集,如AMERICAN_AMERICA.ZHS16GBK
3. 修改服务端编码集(不推荐)
以管理员模式启动cmd
sqlplus / as sysdba
依次执行

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 internal_use AMERICAN_AMERICA.ZHS16GBK; --强制转换,不加internal_use 会报错

SQL> shutdown immediate
SQL> startup

SQL> select userenv('language') from dual;
 


修改完成

总结: 把客户端编码集改为GBK,服务端改为UTF8即可解决中文的乱码问题。

免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐