Oracle数据库中文乱码问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


最近刚开始使用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

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

  1. 打开注册表,找到路径:\HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOME,下的NLS_LANG修改为需要指定的字符集即可
  2. 在系统变量中新建:NLS_LANG = 编码集,如AMERICAN_AMERICA.ZHS16GBK

3. 修改服务端编码集(不推荐)

  1. 以管理员模式启动cmd
  2. sqlplus / as sysdba
  3. 依次执行
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即可解决中文的乱码问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值