Oracle数据库中文乱码问题 | 您所在的位置:网站首页 › 数据库字符编码乱码 › Oracle数据库中文乱码问题 |
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Oracle数据库中文乱码问题 一、乱码出现场景和原因1.乱码场景2.乱码原因 二、解决思路1.先查看客户端和服务端的编码集2. 修改客户端编码集3. 修改服务端编码集(不推荐)最近刚开始使用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. 修改服务端编码集(不推荐) 以管理员模式启动cmdsqlplus / 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即可解决中文的乱码问题。 |
CopyRight 2018-2019 实验室设备网 版权所有 |