浅析Oracle三层全球化支持(NLS)
1、NLS , ‘National Language Support (NLS)’ ,从概念我们看出这个参数实际上定义了数据库的存放数据的语言环境,当我们设定一种nls的时候实际上我们是为oracle在存放数据时指定了他的语种所特有的一些表达形式,比如我们选择chinese,那么它的中文字符如何存放,按什么规则排序,货币如何表示,日期格式也就被设定了。
2、 Oracle对全球化(Global Support)有着全面的支持和解决方案,即用Oracle NLS架构来实现的。
Oracle的Global Support复杂的原因之一,就是Oracle的三层NLS体系。任何一个会话session在连接入数据库之后,都会面对三层NLS参数体系(即每一层都有一套自己的与其他层中同名的NLS参数变量集合。Database level有一个完备的NLS参数集合中各变量的值,这样很大层面上为后面两层提供了一个基础参数集合和存储标准,即当Instance Level里,用户没有为其NLS参数设置值时,则默认用Database level的给其赋值,当Session Level 里,用户没有为其NLS参数设置值时,则默认用Instance Level的给其赋值),分别为:Database、Instance和Session。
3、国际化(即Global Support)的目的就是在于连接到同一个Oracle数据库服务端不同连接用户,都可以看到属于自己的Local化的结果(即同一个数据,在Oracle数据库服务端显示,和在客户端显示,可以按该数据不同的表示形式来显示)。比如,在我们在英文版的Oracle服务端(即Oracle服务端使用的NLS参数为英文字符集,具体说,
SQL> select * from nls_database_parameters;
PARAMETER VALUE
--------------------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CHARACTERSET AL32UTF8(也可以是US7ASCII
)
)
调用时间函数而获得结果为“
17-SEP-12
”,
而在笔者的客户端系统(其使用的NLS参数为中文字符集的,即
SQL> select * from nls_session_parameters;
PARAMETER VALUE
------------------------------ -------------------------
NLS_LANGUAGE SIMPLIFIEDCHINESE
NLS_TERRITORY CHINA
NLS_CHARACTERSET ZHS16GBK)中,
调用时间函数而获得结果显示为“
17-9
月
-12
”。
这都是
Oracle NLS
国际化所起到的作用。该例子的具体配置环境,见正文里的 1、环境介绍 部分。
日期和数字类型的显示,带有很强烈的地区特性。比如,上述例子中,欧美格式“17-SEP-12”和我们更接受的“2012-9-17”就有很大的差距。Oracle将数据取值(即数据存储在oracle数据库中的二进制值)和显示分割开来,让session级别用户可以控制最终的显示。
Instance Level配置是针对所有连接而言的。而国际化的目的就是在于不同连接用户,看到Local化的结果。因此,无论Instance Level进行何种的配置,最终很有可能都是被Session level的所覆盖。
正文:
作为一个成熟的商业数据库软件,Oracle对全球化(Global Support)有着全面的支持和解决方案(即用Oracle NLS架构来实现的)。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国际化所起到的作用;)
ü 软件显示语言;在Oracle软件和一些显示中,很多的字符和软件输出就带有语言特性。比如,在我们在英文版的Oracle服务端,调用时间函数而获得结果为“17-SEP-12”,而在笔者的客户端系统中,调用时间函数而获得结果显示为“17-9月-12”。这都是Oracle NLS国际化所起到的作用;
NLS是一套覆盖面广、内容庞杂的知识体系。笔者计划在接下来用一个系列来分析这个体系。本次,我们只是给NLS一个简单的体系介绍:Oracle的三层NLS体系关系和优先级配置。