pl/sql查询乱码问题

      

       今天遇到plsql查询乱码的问题,排查了好久才找到解决方案,特此记录,以便后查。

       我的问题是由于自己乱操作注册表引起的,之前因为版本问题我自己装的Oracle服务端不兼容,卸载时删除了一些Oracle开头的注册表,之后用plsql查询就出现了乱码。查询时凡是中文的就出现“???”的字样。然后就百度查询了好多帖子,解决方式很多,但是因为版本和系统问题,总得不到解决,最后在csdn上找到了一篇参考着解决了:https://blog.youkuaiyun.com/jiadajing267/article/details/54947800。

       接下来我会介绍问题经过。下面是我的基本配置。

       操作系统:win10.

       oracle客户端:win32_11gR2_client.

       oracle服务端:远程连接。

       出现乱码大多是Oracle客户端和服务端编码方式不一致或是plsql不能完全正确地导入客户端配置文件导致。

       步骤一:使用一个账号通过plsql登录连接oracle服务端。创建查询,在plsql中执行 select userenv('language') from dual;语句。这样是查询Oracle服务端的编码语言,我的是:SIMPLIFIED CHINESE_CHINA.ZHS16GBK。或是 select * from V$NLS_PARAMETERS; 语句,选取1,4,8条语句,三个字符拼接会得到和上面语句一样的字段。接下来就是让本地的编码方式修改为和服务端一样就行。

      步骤二:因为我先出问题是注册表所以就先从注册表开始。使用快捷键win+R,在运行‘regedit’命令进入注册表编辑界面,如果你是64位客户端,查询路径:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDB12Home1 \NLS_LANG,如果是32位客户端路径为:HKEY_LOCAL_MACHINE\SOFTWARE \WOW6432Node \ORACLE\KEY_OraDB12Home1 \NLS_LANG

选中查看,发现对应的名称为:SIMPLIFIED CHINESE_CHINA.ZHS16GBK,这是和服务端查询的一致,如果不一致就可以修改。

       步骤三,经过上面的步骤可以确认我的客户端编码是没有问题的,接下来我就怀疑是不是pl/sql没有完全加载客户端文件呢,打开pl/sql界面,帮助->支持信息->信息,可以查看导入路径文件和编码的配置信息。找到“Character Sets”字段,查看NLS_LANG对应的值,也是SIMPLIFIED CHINESE_CHINA.ZHS16GBK,这说明导入也没有问题。如果不一致就是plsql加载客户端配置文件有问题,大家可以百度下具体操作

       步骤四,上面都没有问题,接下来我就怀疑是服务端有问题,但这是不可能的,毕竟连的远程,人家什么都没操作过。所以我就去csdn搜索,发现可以修改环境变量的NLS_LANG值来操作,接下来有个坑。因为网上有两个版本,一是在系统变量里修改或新增两个变量LANG(看是gbk编码还是其他编码,这里对应的值不一样)或是NLS_LANG:

       LANG=zh_CN.GBK
      NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK。

重启plsql然后不能访问服务器,我又重启了电脑也不能访问服务器。

       接着我试着只使用NLS_LANG变量,接着只需重启plsql就行了。再查询问题就解决了。对于这个现象我怀疑应该是win10操作系统的问题(可能吧,有知道的可以评论或私信下)。

       补充,之前我还看到个版本但还是没有解决但我应该把它记录下来:控制面板--->时间和区域--->区域--->管理--->非Unicode程序中所使用的当前语言
更改系统区域设置里.   去掉 Beta版:使用Unicode UTF-8 提供全球语言支持(U),参考链接:https://com-zyq.iteye.com/blog/2425020

    第一次发贴希望多多交流,接下来我会继续分享我的学习成果和bug。

 

<think>好的,我需要帮助用户解决PL/SQL中的中文乱码问题。首先,用户提到了多个引用,都是关于如何设置字符集和修改环境变量的。我需要整理这些信息,给出一个清晰的步骤指南。 首先,根据引用[1],用户应该先确认数据库的字符集。这很重要,因为乱码通常是由于客户端和服务器端字符集不一致导致的。所以第一步应该是让用户执行SQL查询:select userenv('language') from dual; 这样可以知道数据库当前使用的字符集。 接下来,引用[2]、[3]、[4]都提到了修改注册表和环境变量中的NLS_LANG设置。这里需要注意的是,不同的操作系统可能需要不同的设置方式,但用户提供的引用都是针对Windows系统的。需要分步骤说明如何修改注册表和环境变量,确保PL/SQL客户端的字符集与数据库一致。比如,如果数据库是ZHS16GBK,那么NLS_LANG应该设置为SIMPLIFIED CHINESE_CHINA.ZHS16GBK;如果是UTF8,则对应修改。 另外,可能需要提醒用户在修改后重启PL/SQL Developer才能生效。同时,如果环境变量和注册表都有设置,可能会有优先级的问题,需要确保正确的位置被修改。 还要考虑是否有其他可能的因素,比如客户端操作系统的区域设置是否支持中文字符,或者数据库中的数据是否真的正确存储了中文字符。不过根据用户的问题,重点应该放在字符集设置上。 总结步骤应该是:1. 数据库字符集;2. 设置客户端NLS_LANG;3. 重启验证。同时要给出具体的操作路径和示例,比如注册表路径和环境变量设置方法。最后,生成相关问题,帮助用户深入理解可能的相关问题,比如如何检数据存储是否正确,或者不同字符集之间的转换问题。</think>### PL/SQL中文乱码解决方案 #### **步骤 1:确认数据库字符集** 通过以下SQL查询数据库当前字符集: ```sql SELECT userenv('language') FROM dual; ``` 例如返回值为`SIMPLIFIED CHINESE_CHINA.ZHS16GBK`或`AMERICAN_AMERICA.UTF8`[^1]。 --- #### **步骤 2:设置客户端字符集** 需保证客户端(PL/SQL工具)字符集与数据库一致,通过以下两种方式实现: 1. **修改注册表(Windows系统)** - 路径:`HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\`(对应Oracle安装目录) - 找到或新建`NLS_LANG`键,值设置为数据库字符集,例如: ```text SIMPLIFIED CHINESE_CHINA.ZHS16GBK ``` [^2][^3] 2. **添加系统环境变量** - 右键“计算机” → 属性 → 高级系统设置 → 环境变量 → 新建系统变量: - 变量名:`NLS_LANG` - 变量值:与数据库字符集一致,例如`SIMPLIFIED CHINESE_CHINA.UTF8`[^4] --- #### **步骤 3:重启PL/SQL Developer** 修改后重启PL/SQL工具,检中文字符是否正常显示。若仍乱码,检数据库实际存储数据的字符编码是否与设置一致。 --- #### **补充说明** - 若数据库字符集为`UTF8`,但客户端需要显示`GBK`编码,需通过`AL32UTF8`到`ZHS16GBK`的转换实现兼容。 - 乱码可能由多层级字符集不一致导致(操作系统/数据库/客户端工具),需逐层排。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值