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