Oracle 客户端 NLS_LANG 的设置 一、修改会话的字符集与数据库的字符集一致

参考链接1: https://blog.csdn.net/xinzhan0/article/details/78311417#t3
参考链接2: https://blog.csdn.net/xinzhan0/article/details/78311562

1、操作系统本身有字符集  ---locale -a 或者chcp
2、oracle数据库软件有字符集 
3、oracle软件的操作系统本身也有字符集

AL32UTF8
【AL】支持所有语言(All Language)
【32】每字符最多占用32位(4字节)
【UTF8】编码为UTF-8

WE8MSWIN1252
【WE】支持西欧语言(Western Europe)
【8】每字符需要占用8位(单字节)
【MSWIN1252】编码为CP1252

US7ASCII
【US】表示美国(United States)
【7】每字符需要占用7位
【ASCII】编码为ASCII

字符集说白了是一个集合 ,是一张表,这个表有两列,左面这列是字符是所有要存储的字符。
字符有很多字符 ,比如我们讲中文字符:
左面这列就是中国人常用的所有的中文字符 ,有汉字、英文字母有数字还有一些特殊的符号 ,在左面都出现是我们中文要使用的所有的字符
右边是一个编码,从1号2、3、4、5、6 ,将来提到1的时候就对应着一个字符
所以说字符集就是字符和编码的这么一个对应表

常用字符集:
US7ASCII
ZHS16CGB231280
AL32UTF8
AF16UTF16
ZHS16GBK

数据库字符集

SQL> select * from nls_database_parameters;

PARAMETER						     VALUE
------------------------------------------------------------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NLS_LANGUAGE						     AMERICAN
NLS_TERRITORY						     AMERICA
NLS_CURRENCY						     $
NLS_ISO_CURRENCY					     AMERICA
NLS_NUMERIC_CHARACTERS					     .,
NLS_CHARACTERSET					     AL32UTF8            -------------数据库字符集
NLS_CALENDAR						     GREGORIAN
NLS_DATE_FORMAT 					     DD-MON-RR
NLS_DATE_LANGUAGE					     AMERICAN
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
NLS_NCHAR_CHARACTERSET				    AL16UTF16          ---------------------国家字符集(用的少)
NLS_RDBMS_VERSION					     11.2.0.1.0

客户端字符集

SQL> select * from nls_instance_parameters;             

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

会话字符集

SQL> select * from nls_session_parameters;   

PARAMETER														 VALUE
------------------------------------------------------------------------------------------------------------------------ ----------------------------------------------------------------------------------------------------------------------------------------------------------------
NLS_LANGUAGE													                 AMERICAN
NLS_TERRITORY														 AMERICA
NLS_CURRENCY														 $
NLS_ISO_CURRENCY													 AMERICA
NLS_NUMERIC_CHARACTERS												 .,
NLS_CALENDAR														 GREGORIAN
NLS_DATE_FORMAT 													 DD-MON-RR
NLS_DATE_LANGUAGE													 AMERICAN
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

修改会话显示为中文NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8" ----------.bash_profile里面的参数只是在修改会话的字符集,也可以直接export指定
NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8" -------对应的分别是语言、地区、字符集。
字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk
NLS作用优先级别:Sql function > alter session> 环境变量或注册表> 参数文件> 数据库默认参数

环境模拟
export NLS_LANG="AMERICAN_AMERICA.AL32UTF8" 登入界面显示英文,在linux sqlplus表中插入注释,查看注释正常显示为中文,sqlplus develop中也正常显示,但是sqlplus develop不能改注释,只能在linux中改
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8" 登入界面显示中文,在linux中插入注释,查看住注释正常显示为中文,sqlplus develop中也正常显示,但是sqlplus develop不能改注释,只能在linux中改
若想要在sqlplus developer中支持中文的查看和修改(例如修改表的注释),则在环境变量中加NLS_LANG=AMERICAN_AMERICA.AL32UTF8 --注意:这里只要字符集为AL32UTF8就可以,前面的语言可以任意

Windows  echo %NLS_LANG%
Linux    env | grep NLS_LANG 

例如:数据库为GBK

oracle@pdcsh021v03:~> echo $LANG
zh_CN.UTF-8
oracle@pdcsh021v03:~> echo $NLS_LANG
SIMPLIFIED CHINESE_CHINA.AL32UTF8

数据库查询结果
Oracle 客户端 NLS_LANG 的设置
一、修改会话的字符集与数据库的字符集一致
创建环境变量(只需要字符集一致),创建结果与nls_session_parameters的值对应,PL/SQL显示结果为中文
Oracle 客户端 NLS_LANG 的设置
一、修改会话的字符集与数据库的字符集一致
Oracle 客户端 NLS_LANG 的设置
一、修改会话的字符集与数据库的字符集一致
注:客户端的字符集是在没有设置NLS_LANG环境变量时,会话默认的字符集