1. 主要区别:
NLS_LANG是环境变量,包括3部分NLS参数:NLS_LANGUAGE, NLS_TERRITORY, NLS_CHARACTERSET,需要在启动SQLPLUS等工具之前设置;
NLS_LANGUAGE主要控制SESSION中提示消息的语言,可以使用ALTER SESSION在SQLPLUS里面设置;
NLS_TERRITORY主要控制SESSION中的日期和货币等本地化参数的现实格式,也可以像NLS_LANGUAGE一样在 SESSION 里面设置;
NLS_CHARACTERSET控制客户端的字符集,不能在SESSION里面进行设置,只能通过NLS_LANG环境变量的方式进行设置。
2. 设置方法:
2.1 环境变量设置(windows),下划线必须和territory配对,点必须和字符集配对
set nls_lang=american_america.utf8
set nls_lang=american / set nls_lang=american_ / set nls_lang=american_.
set nls_lang=_america
set nls_lang=.utf8
export nls_lang=american_america.utf8
export nls_lang='simplified chinese_china.zhs16gbk'
2.2 SESSION设置
alter session set nls_language='american' nls_territory='america';
alter session set nls_language='american';
alter session set nls_territory='america';
alter session set nls_language='SIMPLIFIED CHINESE';
alter session set nls_date_language='SIMPLIFIED CHINESE';
alter session set nls_date_format='yyyy-mm-dd HH24:MI:SS';
-- set language
alter session set nls_language ='AMERICAN';
alter session set nls_language = 'SIMPLIFIED CHINESE';
-- set date language
alter session set nls_date_language='AMERICAN';
alter session set nls_date_language='SIMPLIFIED CHINESE';
-- view session nls_language
select USERENV('LANG') from DUAL;
-- view session nls_date_language
select SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language from DUAL;
3. 注意事项:
NLS_CHARACTERSET设置不当会导致数据不能正常显示
4.关于nls_database_parameters、nls_instance_parameters、nls_session_parameters
NLS_SESSION_PARAMETERS、NLS_INSTANCE_PARAMETERS、NLS_DATABASE_PARAMETERS
三个视图的sql定义:
SQL> select view_name,text from dba_views where view_name like 'NLS%';
VIEW_NAME TEXT
------------------------- --------------------------------------------------
NLS_SESSION_PARAMETERS select substr(parameter, 1, 30),
substr(value, 1, 40)
from v$nls_parameters
where parameter != 'NLS_CHARACTERSET' and
parameter != 'NLS_NCHAR_CHARACTERSET'
NLS_INSTANCE_PARAMETERS select substr(upper(name), 1, 30),
substr(value, 1, 40)
from v$system_parameter
where name like 'nls%'
VIEW_NAME TEXT
------------------------- --------------------------------------------------
NLS_DATABASE_PARAMETERS select name,
substr(value$, 1, 40)
from props$
where name like 'NLS%'
可以看出,nls_database_parameters取值与props$,即我们创建数据库时存储在数据库中的熟悉信息,这与环境变量和参数文件等是统统没有关系的。nls_instance_parameters取值与v$system_parameter,下面让我们看一下v$system_parameter 在官方文档的定义:
V$SYSTEM_PARAMETER displays information about the initialization parameters that are currently in effect for the instance.
A new session inherits parameter values from the instance-wide values.
从这里,我们可知,nls_instance_parameters的值有参数文件决定,那么会不会受到环境变量的影响哪?经验证,是不会的!过程如下:
首先,我们来看一下NLS_LANGUAGE的取值
SQL> select parameter,value from nls_instance_parameters where parameter='NLS_LANGUAGE';
PARAMETER VALUE
------------------------------ ------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
关闭数据库,然后修改环境变量NLS_LANG:
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
sys>exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[orabzprd@fmsbzdb1 ~]$ vi .bash_profile
[orabzprd@fmsbzdb1 ~]$ . .bash_profile
[orabzprd@fmsbzdb1 ~]$ set | grep NLS
NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
[orabzprd@fmsbzdb1 ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Wed Jan 1 09:21:30 2025
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 2137886720 bytes
Fixed Size 2230072 bytes
Variable Size 1342179528 bytes
Database Buffers 788529152 bytes
Redo Buffers 4947968 bytes
Database mounted.
Database opened.
SQL> select parameter,value from nls_instance_parameters where parameter='NLS_LANGUAGE';
PARAMETER VALUE
------------------------------ ------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
nls_instance_parameters只受参数文件的影响,而不受环境变量影响。
nls_session_parameters取值与V$NLS_PARAMETERS,它的查询结果默认会从nls_instance_parameters继承,但如果我们在环境变量或者通过ALTER SESSION 改变了nls的相关参数,则会覆盖默认值。
例如,当环境变量NLS_LANG=AMERICAN_AMERICA.AL32UTF8
SQL> select parameter,value from nls_session_parameters where parameter='NLS_LANGUAGE';
PARAMETER VALUE
------------------------------ ------------------------------
NLS_LANGUAGE AMERICAN
例如,当环境变量NLS_LANG='SIMPLIFIED CHINESE_CHINA.AL32UTF8'
SQL> select parameter,value from nls_session_parameters where parameter='NLS_LANGUAGE';
PARAMETER VALUE
------------------------------ ------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
5.常用环境配置:
5.1. 简体中文windows cmd
set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK --sqlplus中文
set NLS_LANG=American_America.ZHS16GBK --英文
5.2. securecrt,Appearance-character encoding GB2312
export LANG=en_US.GB2312
export NLS_LANG='SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
5.3. securecrt,Appearance-character encoding UTF-8
export NLS_LANG='SIMPLIFIED CHINESE_CHINA.AL32UTF8' --中文
export NLS_LANG='American_America.AL32UTF8' --英文
export LANG=en_US.UTF-8
总结一句话就是
LANG,NLS_LANG,客户端OS 这3个字符集一致
(GB2312 ZHS16GBK)
(UTF-8 AL32UTF8)
3层结构--对于oracle,协调3个字符集
数据库、数据库客户端程序、客户端操作系统
数据库字符集
select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET';
select * from nls_database_parameters;
普遍常遇到情况是 AL32UTF8
数据库客户端程序
自己设置NLS_LANG环境变量
NLS_LANG=American_America.AL32UTF8,American表示语言;America表示地区;AL32UTF8字符集类型
oracle字符集表示:
AL32UTF8:AL,代表all,指使用所有语言;32,,32位;UTF8编码
中文 export NLS_LANG='SIMPLIFIED CHINESE_CHINA.AL32UTF8'
英文 export NLS_LANG='American_America.AL32UTF8'
客户端操作系统
securecrt配置或cmd-简体中文WINDOWS的字符编码,或直接在数据库服务器上的terminal
Appearance-character encoding-可按需配置
C:\>chcp
活动代码页: 936
[oracle@localhost ~]$ env | grep LANG
NLS_LANG=American_America.AL32UTF8
LANG=en_US.UTF-8
这里有2个环境变量
NLS_LANG 是专为oracle客户端程序使用的, 如sqlplus程序
LANG 是os 语言环境的设置,安装了多个语言包的话就可以切换,注意优先级是 LC_ALL > LC_* > LANG
因为这里使用终端仿真软件,securecrt,所以相当于多了一层交互
Appearance-character encoding-可按需随意配置
一般配置个能支持中文的就可以
因为我这里配置的是UTF-8
所以相当于3层结构中的 客户端操作系统 就是UTF-8
需要NLS_LANG的encoding,和LANG的encoding,与软件设置的encoding一致
如果没有securecrt之类软件,直接cmd命令行的话
简体中文WINDOWS的字符编码就是GBK,它的缺省代码页是936
C:\>chcp
活动代码页: 936
所以把securecrt的encoding设为GB2312,就是和cmd的环境一样
这时应
export LANG=en_US.GB2312
export NLS_LANG='SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
NLS_LANG、NLS_LANGUAGE、NLS_DATE_LANGUAGE
未经允许不得转载:徐万新之路 » NLS_LANG、NLS_LANGUAGE、NLS_DATE_LANGUAGE
最新评论
这个牛
放下欲望,男人从来不醉,充分且必要
勇气、责任、自信、创新,为天下先!
软件即数据,软件即服务,软件即管理,软件就是对人类各种社会活动的仿真和记录。软件很重要,但软件不可能凌驾于业务之上,尤其不可能高人一等。