再论ORACLE的全球化支持(GLOBALIZATION)

分类: Linux

为了更好的支持软件的本地化,oracle自9i起推出了全球化解决方案,早先版本称之为national language support,即NLS,你可以注意到在oracle中有一些以此缩写开头的视图和参数,全球化解决方案更好的解决不同语言、地域的文化差异性的问题。
一、先明确oracle几个和本地化有关的概念:
1、LANGUAGE也就是语言,它约定了oracle用什么语言显示消息,排序的规则(二进制还是其他的),daynames,月份名称
2、TERRITORY也就是地域,它约定oracle用什么格式显示日期、货币、数字。
3、characterset也就是字符集,它约定了字符的编码方式,请注意客户端和服务器段都有字符集的设置,oracle会自动实现字符转换,当也可能转换失败,用某个替代字符代替如?或其他乱码来代替,这当然不是你期望的结果,字符集的设置非常重要,需要认真考虑。
二、再明确进行本地化设置的几个优先级
ORACLE通过以下5个层次实现本地化的相关设置
数据库级(create database 时指定参数值,创建后通常不建议改变)
实例级(根据init.ora的参数设置)
客户端设置级(通常根据nls_lang来设定)
会话级(通常用alter session命令来修改)
语句级(在编写的sql语句中使用函数进行参数设定)
以上5个层次,本地化设置的优先级依次升高,即实例的设置覆盖数据库的设置,以此类推。

三、字符集编码方案
由于历史原因,不同的字符有不同的编码如ascii,unicode,gb2312等等,为了实现与平台无关,oracle提供了各种字符集的实现,而不是像ms word一样依赖于操作系统提供的字符集,很多的文章都介绍过字符集的相关知识,再此不做赘述
四,究竟有哪些参数需要设定,可以参考下面的内容
NLS_LANGUAGE                                                
NLS_TERRITORY                                                
NLS_CURRENCY                                                 
NLS_ISO_CURRENCY                                             
NLS_NUMERIC_CHARACTERS                                       
NLS_CALENDAR                                                 
NLS_DATE_FORMAT                                              
NLS_DATE_LANGUAGE                                           
NLS_SORT                                                     
NLS_TIME_FORMAT                                              
NLS_TIMESTAMP_FORMAT                                         
NLS_TIME_TZ_FORMAT                                           
NLS_TIMESTAMP_TZ_FORMAT                                      
NLS_DUAL_CURRENCY                                            
NLS_COMP                                                     
NLS_LENGTH_SEMANTICS                                         
NLS_NCHAR_CONV_EXCP  
还有chararcterset和nls_lang
五、以上参数可以指定哪些值
select * from v$nls_valid_values
看看输出结果
(待续)

分类: Linux

一、数据库级的参数设定
先查看nls_database_parameters视图
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                    ZHS16GBK
NLS_CALENDAR                               GREGORIAN
NLS_DATE_FORMAT                       DD-MON-RR
NLS_DATE_LANGUAGE                 AMERICAN
NLS_SORT                                        BINARY
NLS_TIME_FORMAT                        HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT                 HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT    DD-MON-RR HH.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                 9.2.0.1.0
20 rows selected.
SELECT name,value$ from sys.props$ where name like '%NLS%'
结果也是一样的,推荐第一种方案
注意事项:
A.如果数据库创建时没有在Init.ora指定nls参数,那么数据库将使用默认值amercian_america
B.如果instance级和session级没有nls参数,那么数据库也将使用默认的参数值
C.不能在init.ora定义数据库字符集,只能通过create database 命令时指定,从oracle9i开始,数据库默认字符集为:us7ascii,国家字符集为al16utf16
D.create database脚本可以参阅另外一篇文章(尚未完成)
E.可以使用的更改数据库nls设置的命令有以下3个
alter database character set 
alter database national character set 
alter database set time_zone=''
   
将有后续的文章讨论命令的使用
二、实例级的参数设定:
通过nls_instance_paramters查看
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
NLS_LENGTH_SEMANTICS                                         BYTE
NLS_NCHAR_CONV_EXCP                                          FALSE
17 rows selected.
等价于SELECT name,value from v$parameter where name like '%nls%';
也可以用show parameter nls来查询,结果类似
注意事项
A.参数在init.ora设定可以用,alter system来修改
B.如果参数没有通过以上2种方式显示指定,那么它的值不会由更高级的参数派生,例如nls_sort如果没有显示指定,那它的值不会由nls_language派生。
C.nls_lang不是init.ora的参数,所以nls_langguage和nls_territory需要分别指定
D.不能在init.ora定义chararcterset设定
E.如果客户端没有设定nls_lang,nls_session_parameters将使用nls_instance_parameters的值
F.实例的nls_language参数也决定了在alert.log和trace文件中用何种语言记录服务端错误消息。
三、客户端设置
客户端的设置要用到nls_lang这个参数,
完整赋值格式如下:language_territory.characterset也可以language、langguage_terrtory、_territory、.character、
_territory.character,实例如下:
american_america.us7ascii  simple chinese_china.zhs16gbk
american _america .us7ascii _america.us7ascii american_.us7ascii american_america
错误的格式
american.us7ascii  amercia.us7ascii
对于windows系统你可以在注册表(HKEY_LOCAL_MACHINE_SOFTWARE_ORACLE_HOME0)和环境变量(set nls_lang=)里设置其值,由于windows的特性,环境变量的设定会覆盖注册表的设定。
注意事项:
A.如果只指定了language值,那末territory\character可以由language派生出来一个默认值如amercian其默认的terrtory是america,默认的字符集是us7ascii
B.别指望这个字符集和数据库的字符集相同,也别指望改变客户端的字符集的设定值就可以改变客户端程序所用的字符集,这个参数仅仅是告诉oracle你用的客户端所采用的字符集,以便oracle进行正确转换.
C.如果没有设定nls_lang别指望它会自动采用服务器端的nls_lang参数设定,没有设定,它的值就是AMERICAN_AMERICA.US7ASCII.
D.这个值设定与数据库采用何种字符集存储数据无关
E.不能在客户端环境变量或注册表中独自设置NLS_LANGUAGE  NLS_TERRITORY
F.ns_lang的不会在任何系统表和视图显示
一个查看nls_lang设定的技巧
在sqlplus环境下
sql>@%nls_lang%根据提示就可以知道到底nls_lang有没有设定值,想一想为什么?
四、会话级设置
查看nls_session_paramters;
SQL> select * from nls_session_parameters;
PARAMETER                                                    VALUE
------------------------------------------------------------ -------------------
NLS_LANGUAGE                                                 AMERICAN
NLS_TERRITORY                                                AMERICA
NLS_CURRENCY                                                 $
NLS_ISO_CURRENCY                                             AMERICA
NLS_NUMERIC_CHARACTERS                                       .,
NLS_CALENDAR                                                 GREGORIAN
NLS_DATE_FORMAT                                              DD-MON-RR
NLS_DATE_LANGUAGE                                            AMERICAN
NLS_SORT                                                     BINARY
NLS_TIME_FORMAT                                              HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT                                         DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT                                           HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT                                      DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY                                            $
NLS_COMP                                                     BINARY
NLS_LENGTH_SEMANTICS                                         BYTE
NLS_NCHAR_CONV_EXCP                                          FALSE
17 rows selected.
select * from v$nls_parameters生成的结果比使用
select * from nls_session_parameters
多了2行数据库字符集的信息
 
一旦连接后,就可以用alter session命令来更改会话级的设置
常用的修改命令如下
SQL> alter session set nls_date_format='dd.mm.yyyy';
Session altered.
SQL> execute dbms_session.set_nls('nls_date_format','''dd.mm.yyyy''');
PL/SQL procedure successfully completed.

以上2个命令更改的效果是等效的
注意事项:
A.nls_session_parameters依赖于客户端nls_lang的设定
B.如果客户端没有设定nls_lang,nls_session_parameters将使用nls_instance_parameters的值
C.如果设定了参数,NLS_SESSION_PARAMETERS 优先级总要高于NLS_INSTANCE_PARAMETERS 和 NLS_DATABASE_PARAMETERS.
D.无法从服务端控制这个设置的开关,因为客户端的参数优先级总是高于实例段和数据库端的设定
E NLS_LANG 不能用 ALTER SESSION修改, NLS_LANGUAGE and NLS_TERRITORY 可以. 但是However 
F NLS_SESSION_PARAMETERS 对于其他会话不可见. 如果你想追踪其他会话的值,可以通过logon trigger来记录
G session 的NLS_LANGUAGE 也指明用何种语言显示客户端错误信息
H 用alter session 命令修改,不能用sql脚本  "set"  NLS 参数
五、SQL语句级
语句级的设置是优先级最高的,通过在sql语句利用函数来实现,如
SQL> select to_char(sysdate,'yyyy month dd day','nls_date_language=american') as
 american,to_char(sysdate,'yyyy month dd day','nls_date_language=german') as german from dual;
AMERICAN                    GERMAN
--------------------------- ----------------------------
2008 april     23 wednesday 2008 april     23 mittwoch
SQL> select to_char(sysdate,'yyyy month dd day') from dual;
TO_CHAR(SYSDATE,'YYYYMONTHD
---------------------------
2008 april     23 wednesday
可以看到,语句级的nls更改,并没有影响到session的nls设置
 
总结下,SQL STATEMENT > SESSION > CLIENT SETTING > INSTANCE > DATABASE
 
补充2个常用的SQL语句
1 select userenv('lang') from dual;
        显示session的nls_language的缩写
2 select userenv('language') from dual;和select sys_context('userenv','language') from dual;
    显示session的_ and 数据库的 character set.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值