现象描述
可能有人经常会遇到sqlplus、plsql dev等其他工具连接数据库的时候会发现乱码
例如下面图:


原因
出现这种乱码现象往往就是客户端的语言环境和数据库的语言环境不一样导致的,通常我们dbca创建数据库地区语言默认是AMERICAN的,然后很多人安装操作系统习惯性选择中文,所以就会出现客户端乱码的情况。
通过以下这两个视图可以比较出来;
nls_instance_parameters:数据库实例地区语言环境查看
nls_session_parameters:连接会话地区语言环境,这是继承客户端地区语言环境的
select * from nls_instance_parameters;SQL> SQL> SQL>
PARAMETER VALUE
------------------------------ ------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_SORT
NLS_DATE_LANGUAGE
NLS_DATE_FORMAT
NLS_CURRENCY
NLS_NUMERIC_CHARACTERS
NLS_ISO_CURRENCY
NLS_CALENDAR
NLS_TIME_FORMAT
NLS_TIMESTAMP_FORMAT
NLS_TIME_TZ_FORMAT
NLS_TIMESTAMP_TZ_FORMAT
NLS_DUAL_CURRENCY
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
Note:可以看到数据库实例的地区语言是英文的
SQL> select * from nls_session_parameters;
PARAMETER VALUE
------------------------------ ------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
NLS_CURRENCY £¤
NLS_ISO_CURRENCY CHINA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE SIMPLIFIED CHINESE
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY £¤
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
Note:可以看到客户端地区语言是中文的
所以此时客户端的语言编码就会出现乱码
问题处理
方式一:修改客户端环境变量
修改客户端地区语言跟数据库实例一致,上面查询结果数据库实例地区语言为AMERICAN,故将其修改为AMERICAN。
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
Note:点后缀字符集跟数据库一致即可。
方式二:修改数据库会话
也可以修改会话的地区语言环境,当前会话生效
alter session set NLS_LANGUAGE='AMERICAN';
Note:xshell等客户端工具要设置编码为gbk,plsql dev本身不需要,设置完操作系统环境变量即可
最后修改时间:2022-03-31 22:13:21
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




