Oracle入门精读29-Oracle客户端字符集与NLS_LANG环境变量

NLS_LANG环境变量说明

格式如下

NLS_LANG = LANGEAGE_TERRITORY.CHARSET

1)LANGUAGE:客户端系统所使用的语言。

   操作系统使用简体中文,则为SIMPLIFIED CHINESE;若操作系统使用英文,则为AMERICAN。

   主要涉及到字符数据的排列顺序及年月日名称表示。

2)TERRIYTOR:客户端系统所在的地区

   默认的日期,货币以及数字格式,每个地区都有唯一名称。如CHINA,AMERICA或CANADA。

3)CHARSET:客户端应用程序所使用的字符集。

   NLS_LANG环境变量,能让字符数据在客户端字符集和数据库字符集之间正确地转换。在客户端使用sqlplus,常会遇到访问远程oracle数据库时中文显示乱码

客户端字符集

查询客户端字符集

Cmd > chcp

     Oracle入门精读29-Oracle客户端字符集与NLS_LANG环境变量

新建环境变量, NLS_LANG =SIMPLIFIED CHINESE_CHINA.ZHS16GBK

重启电脑,再用sqlplus登录

Oracle入门精读29-Oracle客户端字符集与NLS_LANG环境变量

服务器端字符集

win+R –cmd  执行sqlplus 用户名/密码@服务名

cmd>sqlplus sys/[email protected] as sysdba

Sqlplus>select userenv('language') from dual;

Oracle入门精读29-Oracle客户端字符集与NLS_LANG环境变量

   查看数据库的字符集

SQLplus> select * from nls_database_parameters where parameter ='NLS_CHARACTERSET';

Oracle入门精读29-Oracle客户端字符集与NLS_LANG环境变量

dump函数获得字符在数据库的编码

根据AL32UTF8的编码,“中国”两字的正确编码为(都为3个字节):中--e4,b8,ad  国--e5,9b,bd

Oracle入门精读29-Oracle客户端字符集与NLS_LANG环境变量

SQL> select id,dump(strvar,1016) from test;

Oracle入门精读29-Oracle客户端字符集与NLS_LANG环境变量

小实验

1)设置客户端的NLS_LANG参数   

 ##设置NLS_LANG和数据库字符集相同

cmd>set nls_lang=Simplified Chinese_China.AL32UTF8       

2)sqlplus 重新登录

    cmd>>sqlplus sys/[email protected] as sysdba

3)sql>insert into test values(6,’中国’);

4) sql>select id,dump(strvar,1016) from test;

  Oracle入门精读29-Oracle客户端字符集与NLS_LANG环境变量

insert过程:

”中国“两字在客户端操作系统字符集ZHS16GBK中的编码是”d6,d0,b9,fa",由于在设置会话中的NLS_LANG和数据库字符集相同,数据库端对客户端传过来的字符编码不进行任何转换直接存入数据库,因此数据库中存储的编码也是“d6,d0,b9,fa”.

Oracle入门精读29-Oracle客户端字符集与NLS_LANG环境变量

select过程:

1)数据库端读取的编码是“d6,d0,b9,fa”,由于在设置会话中的NLS_LANG和数据库字符集相同,则客户端对数据库端传过来的字符编码不进行任何转换直接显示,编码”d6,d0,b9,fa“在客户端操作系统字符集ZHS16GBK对应的汉字为“中国”。

2)数据库端读取的编码是”e4,b8,ad,e5,9b,bd“,由于NLS_LANG和数据库字符集相同,客户端对数据库端传过来的字符编码不进行任何转换直接显示,编码”e4,b8,ad,e5,9b,bd“在客户端操作系统字符集ZHS16GBK对应的汉字为“涓   浗”(原本2个字符,现在变成了3个字符,因为ZHS16GBK的汉字以2个字节编码)。

小结;

如果客户端操作系统的字符集和数据库字符集间无法正确转换,则应该首先改变客户端终端的字符集,而不是简单地把NLS_LANG设为和数据库字符集一样