提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
最近刚开始使用oracle,被中文乱码问题折腾的不行。使用公司的远程库就没问题, 换到自己的本地环境使用中文就各种乱码,真是头疼。所幸正巧看到一篇文章,理解后已经完全解决了乱码问题。
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;
服务端
SELECT * FROM NLS_DATABASE_PARAMETERS;
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即可解决中文的乱码问题。