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
新建环境变量, NLS_LANG =SIMPLIFIED CHINESE_CHINA.ZHS16GBK
重启电脑,再用sqlplus登录
服务器端字符集
win+R –cmd 执行sqlplus 用户名/密码@服务名
cmd>sqlplus sys/K17000205@GSDOORDB as sysdba
Sqlplus>select userenv('language') from dual;
查看数据库的字符集
SQLplus> select * from nls_database_parameters where parameter ='NLS_CHARACTERSET';
dump函数获得字符在数据库的编码
根据AL32UTF8的编码,“中国”两字的正确编码为(都为3个字节):中--e4,b8,ad 国--e5,9b,bd
SQL> select id,dump(strvar,1016) from test;
小实验
1)设置客户端的NLS_LANG参数
##设置NLS_LANG和数据库字符集相同
cmd>set nls_lang=Simplified Chinese_China.AL32UTF8
2)sqlplus 重新登录
cmd>>sqlplus sys/K17000205@GSDOORDB as sysdba
3)sql>insert into test values(6,’中国’);
4) sql>select id,dump(strvar,1016) from test;
insert过程:
”中国“两字在客户端操作系统字符集ZHS16GBK中的编码是”d6,d0,b9,fa",由于在设置会话中的NLS_LANG和数据库字符集相同,数据库端对客户端传过来的字符编码不进行任何转换直接存入数据库,因此数据库中存储的编码也是“d6,d0,b9,fa”.
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设为和数据库字符集一样。