作为一个成熟的商业 数据库 软件 , Oracle 对全球化( Global Support )有着全面的支持和解决方案。 Oracle 在国际化支持方面主要体现在几个方面: ü 全球化字符集支持;目前, Oracle 支持所有主流的字符集样式。通过 NLS_CHARACTER 和 NLS_NCHAR_CHARACT
作为一个成熟的商业 数据库 软件 , Oracle 对全球化( Global Support )有着全面的支持和解决方案。 Oracle 在国际化支持方面主要体现在几个方面:
ü 全球化字符集支持;目前, Oracle 支持所有主流的字符集样式。通过 NLS_CHARACTER 和 NLS_NCHAR_CHARACTER 指定的字符集可以支持全世界绝大多数语言文字的存储。 Oracle 推荐的字符集样式为 AL32UTF8 ,也就是通常我们所见的 UTF-8 编码格式;
ü 全球化时区 Timezone 支持;全球化一个重要问题就是时区显示和保存问题。不同时区的用户同时向一个数据库插入数据,其时间先后是不可能回避的问题。同时,当非本地时区日期类型显示的时候,时区如何进行转换。 Oracle 在这个问题上提供了两个类型: Timestamp with timezone 和 Timestamp with local timezone ,方便的解决了这些问题;
ü 日期和数字格式显示问题;日期和数字类型的显示,带有很强烈的地区特性。比如,欧美格式“ 17-SEP-12 ”和我们更接受的“ 2012-9-17 ”就有很大的差距。 Oracle 将数据取值和显示分割开来,让 session 级别用户可以控制最终的显示;
ü 软件显示语言;在 Oracle 软件和一些显示中,很多的字符和软件 输出就带有语言特性。比如,我们在英文版的 Oracle 服务端调用时间函数,获得“ 17-SEP-12 ”,而在笔者的客户端系统中,就显示为“ 17-9 月 -12 ”。这都是 Oracle NLS 国际化所起到的作用;
NLS 是一套覆盖面广、内容庞杂的知识体系。笔者计划在接下来用一个系列来分析这个体系。本次,我们只是给 NLS 一个简单的体系介绍: Oracle 的三层 NLS 体系关系和优先级配置。
1 、环境介绍
笔者选择 Oracle 11gR2 进行试验。
SQL> select * from v$version;
BANNER
---------------------------------------
Oracle Database 11g EnterpriseEdition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 – Production
服务器 是 Red Hat 5.3 32bit , 安装 时选择的是英文,美语。
[oracle@bspdev ~]$ uname -a
Linux bspdev.localdomain 2.6.18-308.el5 #1 SMP Tue Feb 21 20:05:41EST 2012 i686 i686 i386 GNU/Linux
查看 Linux 系统支持语言和时区:
[oracle@bspdev ~]$ cat /etc/sysconfig/i18n
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
[oracle@bspdev sysconfig]$ pwd
/etc/sysconfig
[oracle@bspdev sysconfig]$ cat clock
# The ZONE parameter isonly evaluated by system-config-date.
# The timezone of the system is defined by the contents of/etc/localtime.
ZONE="Asia/Shanghai"
UTC=true
ARC=false
客户端使用的是中文的 Windows 7 ,对应的 Oracle 注册表内容为:
NLS_LANG 参数告知本地所在地 中国 、中文语言和 ZHS16GBK 字符集。
2 、三层 NLS 体系
Oracle 的 Global Support 复杂的原因之一,就是 Oracle 的三层 NLS 体系。任何一个会话 session 在连接入数据库之后,都会面对三层 NLS 参数体系,分别为: Database 、 Instance 和 Session 。
ü Database Level NLS Parameter :数据库层面的 NLS 参数是 在数据库创建 的时候确定的一系列的参数。在创建数据库的时候,我们都可以通过 OUI 或者 responseFile 进行配置。 大部分 Database Level NLS Parameter 都是不可以改变,或者不能轻易改变的,如 CharacterSet ;
ü Instance Level NLS Parameter :在数据库运行过程中,一些 NLS 参数是通过 Spfile/Pfile 参数文件进行配置,并且可以对 Database Level NLS 进行一定的覆盖修改。 如果 Instance Level 与 Database Level 的发生冲突,以 Instance Level 覆盖 Database Level 的配置;
ü Session Level NLS Parameter :这个层面是和用户连接效果最直接的层面。用户使用的 NLS 参数很多都是取到这个层面的参数。 Session Level Parameter 来自客户端配置内容,主要是通过一系列的环境变量来确定。 Session Level 的 Parameter 是可以覆盖 Instance Level 的参数的;
下面我们分别来介绍几个层面参数中的重要内容。
3 、 Database Level NLS Parameter
Database level 参数是三层体系中最底层,这个层面的参数取值和 Oracle 数据库创建时的配置选项密切相关。我们在联入数据库时,可以通过几个视图来查看这个“根本性”的参数内容。
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.SSXFFAM
NLS_TIMESTAMP_FORMAT DD-MON-RRHH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFFAM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RRHH.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
20 rows selected
nls_xxx_parameters 系列视图非常重要,特别是在我们配置 NLS 参数的过程中。我们可以通过 nls_database_parameters 查看到 Database 的 NLS 参数。
NLS_CHARACTERSET 和 NLS_NCHAR_CHARACTERSET 用于表示 Oracle 在保存 varchar2/char 和 nvarchar2/nchar 字段时的保存类型。从 Oracle 官方推荐的角度,我们设置 AL32UTF8 字符集作为数据库字符集,基本上就可以应对常见的字符文字类型了。
在安装程序 OUI 运行是, AL32UTF8 往往不是默认选项。 Oracle OUI 程序会根据所在服务器操作系统的配置内容,为我们选择出一个字符集。
在从操作系统选择出字符集合的过程中, NLS_LANG ( LANG )环境变量起到很重要的作用。 NLS_LANG 是我们安装 Oracle 过程中,确定 NLS 参数的一个重要环境变量。
根据 Oracle 的要求, NLS_LANG 中包括了 Oracle 所在地域 Territory 、语言 Language 和字符集 CharacterSet 三部分内容。
NLS_LANG=_.
如果我们需要在配置 Oracle 前就确定这些参数内容,可以预先定义环境变量 NLS_LANG 。 Unix/Linux 环境下,可以配置在 Oracle 用户的 .bash_profile 中。而 Windows 环境下,这个参数要配置在注册表中。
此外, NLS_DATA_LANGUAGE 用来表示 Oracle 在显示日期类型的文字内容时,使用什么语言。
Database Level NLS parameter 是非常基本的,起作用的范围主要数据库内部。另一方面, Database Level NLS Parameter 是作为 Instance Level 配置的默认基础值。在安装数据库后,我们基本不能、也不会对 database level 的 NLS 参数进行修改。我们的“手脚”只能在 Instance 和 Session level 进行。
3 、 Instance level NLS Parameter
Instance Level NLS parameter ,就是我们可以控制的领域了。 Instance 参数主要来自于参数文件 SPFILE/PFILE 。我们可以通过 nls_instance_parameters 来查看这个层面的参数配置。
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
17 rows selected
相对于 database level , Instance level 的参数数量是很少的。通常我们不会在参数文件层面进行 NLS 参数配置,保持 Database Level 的默认配置就可以了。
这样的原因是 Instance Level 配置是针对所有连接而言的。而国际化的目的就是在于不同连接用户,看到 Local 化的结果。无论 Instance Level 进行何种的配置,最终很有可能都是被 Session level 的所覆盖。
Database level 之所以会有完备的 NLS 参数,很大层面上是提供了一个基础参数集合和存储标准。 NLS 的重头在 session 层面。
4 、 Session Level NLS Parameter
Session Level 的 NLS 参数是和用户最直接交互的部分。我们可以通过 nls_session_parameters 视图查看到这个内容。
SQL> select * from nls_session_parameters;
PARAMETER VALUE
------------------------------ -------------------------
NLS_LANGUAGE SIMPLIFIEDCHINESE
NLS_TERRITORY CHINA
NLS_CURRENCY ¥
NLS_ISO_CURRENCY CHINA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE SIMPLIFIEDCHINESE
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFFAM
NLS_TIMESTAMP_FORMAT DD-MON-RRHH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFFAM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RRHH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY ¥
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
17 rows selected
session level 的参数是影响最终我们看到 NLS 结果的控制因素。 Session level 的 NLS 参数来自客户端配置。对 Windows 而言,就是我们注册表中关于 NLS_LANG 等一系列的环境变量。对 Unix/Linux 而言,就是我们配置在 .bash_profile 文件中定义的相应内容。
注意, NLS_LANG 本身包括的内容很多。 NLS_LANG 包括了客户端地域、语言和字符集信息。地域间接影响到时区,语言会影响到显示语言。而字符集更是影响数据从服务器传递过来客户端后,进行的转换策略。
在三层 NLS 体系下, Session Level 的 Parameter 起到最后的决定作用。如果 Session level 没有配置, Oracle 会选择 Instance 乃至 Database 的配置。 Session Level 的配置会覆盖 Instance level 的取值。
我们可以根据自己的情况,动态的进行调节 session level nls parameter 。如果我们只是希望 NLS 暂时性修改,可以选择 alter session set 语句进行参数切换。
SQL> select sysdate from dual;
SYSDATE
--------------
17-9月 -12
SQL> alter session set nls_date_format='yyyy-mm-ddhh24:mi:ss';
会话已更改。
SQL> select sysdate from dual;
SYSDATE
-------------------
2012-09-17 06:23:58
如果希望长期的修改,可以考虑在环境变量的层面上修改参数。在 windows 上,可以添加注册表参数。
SQL> select * from nls_session_parameters whereparameter='NLS_DATE_FORMAT';
PARAMETER VALUE
------------------------------ -------------------------
NLS_DATE_FORMAT yyyy-mm-ddhh24:mi:ss
SQL> conn sys/oracle@wilson as sysdba
已连接。
SQL> select sysdate from dual;
SYSDATE
-------------------
2012-09-17 06:29:02
5 、结论
NLS 参数对我们开发和使用 Oracle ,至关重要!
查看更多关于【不错】浅析Oracle三层全球化支持(NLS)的详细内容...