sqlplus显示乱码解决方法

sqlplus显示乱码与三个方面有关

1.数据库的字符编码

--查看数据库的编码
SELECT * FROM NLS_DATABASE_PARAMETERS;

本例中,可以看到数据库中字符串(char,varchar2,clob,long)使用的是AL32UTF8编码存储,即UTF8存储。数据库中的NCHAR,NVARCHAR等使用的是AL16UTF16编码存储,即UTF16存储。

2.客户端的字符编码

通过NLS_LANG环境变量进行设置,设置NLS_LANG环境变量的方式有一下三种:

第一种:设置系统环境变量

右键《我的电脑》——》《高级系统设置》——》《环境变量》,设置NLS_LANG=AMERICAN_AMERICA.AL32UTF8

第二种:使用注册表

安装Oracle客户端后,Oracle客户端会自动在注册表中新增NLS项目并赋值(赋值的编码跟随系统设定)

WIN+R——》regedit——》HKEY_LOCAL_MACHINE——》SOFTWARE——》WOW6432Node——》ORACLE——》KEY_OraClient12Home1_32bit(这里要注意,如果安装的是64位的Oracle,那么直接在SOFTWARE下就可以找到ORACLE)

本例中,跟随系统的是中文繁体,950为繁体,936为简体。

第三种:sql developer,pl/sql developer,toad for oracle等客户端会自动设置NLS(没有找到在哪里看,但猜测是UTF8)

3.终端的字符编码

终端的字符编码分类两类:

第一类:sqlplus调用的CMD终端

依旧是跟随系统,设置的为繁体

第二类:toad for oracle等客户端

这些客户端会自动设置(没有看到在哪里看,但猜测是UTF8)

4.从头到尾过一遍

本例使用sqlplus来过一遍,toad for oracle等客户端不具有代表性,全部自动设置了

4.1.查看数据库的字符编码

SELECT * FROM NLS_DATABASE_PARAMETERS;

因为我测试数据使用的是【varchar2】类型,因此编码为AL32UTF8

4.2.查看Oracle客户端的字符编码

通过2的截图,可以知道,编码类型为WIN950,即中文繁体

4.3.查看CMD终端的字符编码

通过3的截图,可以知道,编码类型为950,即中文繁体

4.4.过程梳理

通过以上查询,可以得出如下流程:当一个查询发出后,存储在数据库中编码为UTF8的汉字发现客户端是BIG5,因为会自动转换,等这个汉字到达客户单的时候编码已经变为BIG5了,终端以BIG5的编码显示,因此中文繁体的汉字是不会乱码。但是存储在数据库中编码为UTF8的简体汉字发现客户端是BIG5,BIG5中没有对应简体的编码,因此到达客户端时已经乱码,在终端显示肯定为乱码

接下来修改客户端编码为UTF8。这时候,数据库到客户端的汉字(繁体或者简体)都不需要在转码了,到达客户端是UTF8形式编码的,此时终端使用BIG5显示,会导致全部乱码。

接下来我们修改终端编码为UTF8,此时到达客户端的是UTF8编码,终端使用UTF8编码显示,就不会乱码了。

在CMD中使用【chcp 65001】命令可以将CMD编码设定为UTF8

posted @ 2021-03-26 09:11  monkey6  阅读(5120)  评论(0编辑  收藏  举报