提出问题比解决问题重要,知道做什么比知道如何做更重要

再论ORACLE的全球化支持(GLOBALIZATION)之二(设置部分)

上一篇 / 下一篇  2008-04-23 16:11:20 / 个人分类:ORACLE相关

一、数据库级的参数设定ITPUB个人空间WY_@^| y] }f
先查看nls_database_parameters视图ITPUB个人空间-t&XH2VQ&W9Z%~)l
SQL> select * from nls_database_parameters;
PARAMETER                                     VALUEITPUB个人空间4JE5@^{y4M
------------------------------                      -------------------------------------------ITPUB个人空间AY C)pR2BT
NLS_LANGUAGE                              AMERICAN
7fE p%Y1Fq:cx0NLS_TERRITORY                             AMERICAITPUB个人空间#[#xua"n-R nS
NLS_CURRENCY                             $
3| ]1jK}(eZrY@0NLS_ISO_CURRENCY                    AMERICAITPUB个人空间 U+\ ]R2M+I8Q,x
NLS_NUMERIC_CHARACTERS    .,
!z`B"Kt9w3_h~0NLS_CHARACTERSET                    ZHS16GBKITPUB个人空间1hwS/y'r,LX8k
NLS_CALENDAR                               GREGORIANITPUB个人空间s@C v6n$| [
NLS_DATE_FORMAT                       DD-MON-RR
s$J$XgA0o0NLS_DATE_LANGUAGE                 AMERICANITPUB个人空间\'Vt8jC5o w-r
NLS_SORT                                        BINARYITPUB个人空间)bo)dTyh ]Y-n
NLS_TIME_FORMAT                        HH.MI.SSXFF AMITPUB个人空间0`st$n'_+ev)m%JY+Pj s
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
#[V0z#~&`W%a_0NLS_TIME_TZ_FORMAT                 HH.MI.SSXFF AM TZRITPUB个人空间9SFd`h%F
NLS_TIMESTAMP_TZ_FORMAT    DD-MON-RR HH.MI.SSXFF AM TZR
h)@bS/qN~zV[-r0NLS_DUAL_CURRENCY               $ITPUB个人空间-l!D? ?QM6w
NLS_COMP                                       BINARY
)k5}1i[+O4e%ULS_LENGTH_SEMANTICS          BYTEITPUB个人空间h%@7_$t4sQU,Pb$}
NLS_NCHAR_CONV_EXCP          FALSEITPUB个人空间 R/{&X_M9c1U[*r S
NLS_NCHAR_CHARACTERSET  AL16UTF16
c,t]X+u;W0NLS_RDBMS_VERSION                 9.2.0.1.0
20 rows selected.
SELECT name,value$ from sys.props$ where name like '%NLS%'ITPUB个人空间1|alx|9s8_
结果也是一样的,推荐第一种方案
注意事项:ITPUB个人空间F,M$wU.J@4kA
A.如果数据库创建时没有在Init.ora指定nls参数,那么数据库将使用默认值amercian_americaITPUB个人空间:v.l6_4MH`t+I
B.如果instance级和session级没有nls参数,那么数据库也将使用默认的参数值
I m+r(A/Fk5Zd$syOY0C.不能在init.ora定义数据库字符集,只能通过create database 命令时指定,从oracle9i开始,数据库默认字符集为:us7ascii,国家字符集为al16utf16ITPUB个人空间woz t_+ZH
D.create database脚本可以参阅另外一篇文章(尚未完成)
-y9YH1O&R$G&w0E.可以使用的更改数据库nls设置的命令有以下3个
;vd;E4qKP L3@h0alter database character set
$nhN |Zw/L0alter database national character setITPUB个人空间M2` B @aSk
alter database set time_zone=''
   
sf n1a]*Q$s(f l(U0将有后续的文章讨论命令的使用ITPUB个人空间-{&}fbf~0m\
二、实例级的参数设定:
/E'Z;u+a2]oOD1V0通过nls_instance_paramters查看ITPUB个人空间M U ^{ X3EcZa
SQL> select * from nls_instance_parameters;
PARAMETER                                                    VALUEITPUB个人空间ru+Q#E]+]
------------------------------------------------------------ ---------------
Q&aZXW-]U0NLS_LANGUAGE                                                 AMERICANITPUB个人空间 x6{ zL@!Y
NLS_TERRITORY                                                AMERICAITPUB个人空间-r3X?C:f:w
NLS_SORT
Q1G.mKW._"za0NLS_DATE_LANGUAGEITPUB个人空间UkV%U&S md
NLS_DATE_FORMAT
cs2Wm6p0NLS_CURRENCYITPUB个人空间;]T:?NTi"O3su|]
NLS_NUMERIC_CHARACTERS
KtV#FYz0NLS_ISO_CURRENCY
uvL _e#dD(G0NLS_CALENDARITPUB个人空间FQD@3}GO!~Mc
NLS_TIME_FORMAT
EdT"Yt0gp"j0NLS_TIMESTAMP_FORMATITPUB个人空间.Pb4LF+C"_MDnV&Th1b
NLS_TIME_TZ_FORMATITPUB个人空间Qxzy:Qq{!^
NLS_TIMESTAMP_TZ_FORMATITPUB个人空间Z]q;a.X
NLS_DUAL_CURRENCY
ly*{-g!f*}+F3`0NLS_COMP
1z6j;UL \9iR0NLS_LENGTH_SEMANTICS                                         BYTEITPUB个人空间\YS"D/P|.d+f/W
NLS_NCHAR_CONV_EXCP                                          FALSE
17 rows selected.ITPUB个人空间L6w;o-?"N e!f.Dc2qv
等价于SELECT name,value from v$parameter where name like '%nls%';
&k uua6E'e5dUGN0也可以用show parameter nls来查询,结果类似
注意事项
6deved6a j0A.参数在init.ora设定可以用,alter system来修改ITPUB个人空间!Sv.y7Fx7d
B.如果参数没有通过以上2种方式显示指定,那么它的值不会由更高级的参数派生,例如nls_sort如果没有显示指定,那它的值不会由nls_language派生。ITPUB个人空间s+Y+H6}'u0L
C.nls_lang不是init.ora的参数,所以nls_langguage和nls_territory需要分别指定
"~|!n wkqc'hL0D.不能在init.ora定义chararcterset设定ITPUB个人空间H+c4n)gC
E.如果客户端没有设定nls_lang,nls_session_parameters将使用nls_instance_parameters的值
T1X{Un(d0F.实例的nls_language参数也决定了在alert.log和trace文件中用何种语言记录服务端错误消息。ITPUB个人空间{9v-Y8d p'Nu
三、客户端设置
(Ln9p$ck:Te!S1``0
客户端的设置要用到nls_lang这个参数,
9\)STp)G0完整赋值格式如下:language_territory.characterset也可以language、langguage_terrtory、_territory、.character、
_territory.character,实例如下:ITPUB个人空间yU]l&V!am$^
american_america.us7ascii  simple chinese_china.zhs16gbkITPUB个人空间kfB }]0{0y
american _america .us7ascii _america.us7ascii american_.us7ascii american_americaITPUB个人空间6IL(\p#y
错误的格式
#s*tK;cd5}5v;a0american.us7ascii  amercia.us7ascii
;^U [xIj0对于windows系统你可以在注册表(HKEY_LOCAL_MACHINE_SOFTWARE_ORACLE_HOME0)和环境变量(set nls_lang=)里设置其值,由于windows的特性,环境变量的设定会覆盖注册表的设定。
__1D }I OBF9D T'Ej0注意事项:
x C1k3t n8N`E(QS p1IJ5U0A.如果只指定了language值,那末territory\character可以由language派生出来一个默认值如amercian其默认的terrtory是america,默认的字符集是us7ascii
T+i:WV't/@yN0B.别指望这个字符集和数据库的字符集相同,也别指望改变客户端的字符集的设定值就可以改变客户端程序所用的字符集,这个参数仅仅是告诉oracle你用的客户端所采用的字符集,以便oracle进行正确转换.ITPUB个人空间j:t,T+be&t
C.如果没有设定nls_lang别指望它会自动采用服务器端的nls_lang参数设定,没有设定,它的值就是AMERICAN_AMERICA.US7ASCII.
b C4xie)J;D0D.这个值设定与数据库采用何种字符集存储数据无关ITPUB个人空间1e,?-^l)M9i
E.不能在客户端环境变量或注册表中独自设置NLS_LANGUAGE  NLS_TERRITORYITPUB个人空间!GZsb y:k$BlqR
F.ns_lang的<clients characterset>不会在任何系统表和视图显示
'QfE1|4N`X#j&Z u0一个查看nls_lang设定的技巧ITPUB个人空间7U5IPk"]2u/?)Q)p
在sqlplus环境下
d^K1e5Zz!aa&V0sql>@%nls_lang%根据提示就可以知道到底nls_lang有没有设定值,想一想为什么?
a$h7VzK0
四、会话级设置
8jP*kjN0查看nls_session_paramters;ITPUB个人空间x)f1BRF.J
SQL> select * from nls_session_parameters;
PARAMETER                                                    VALUE
+`/F6A)`?M m0------------------------------------------------------------ -------------------ITPUB个人空间[%BZ7T.s ~B+z0H7pN'Sk
NLS_LANGUAGE                                                 AMERICAN
b$O?:P x D5b?0NLS_TERRITORY                                                AMERICAITPUB个人空间)@5Rq x%g{
NLS_CURRENCY                                                 $ITPUB个人空间fBB#\"j(K
NLS_ISO_CURRENCY                                             AMERICA
bF)v ysu,u H0NLS_NUMERIC_CHARACTERS                                       .,
[Wb|'YAg0NLS_CALENDAR                                                 GREGORIANITPUB个人空间RC uS2o9\'p/qi(Zs
NLS_DATE_FORMAT                                              DD-MON-RRITPUB个人空间 a&z-n!u3?b4x&a
NLS_DATE_LANGUAGE                                            AMERICANITPUB个人空间&lR6?K*w*Yxn
NLS_SORT                                                     BINARY
\#c#~2u LU A0NLS_TIME_FORMAT                                              HH.MI.SSXFF AM
O6pfj;y_T0NLS_TIMESTAMP_FORMAT                                         DD-MON-RR HH.MI.SSXFF AM
Y^&O/o8d}*Rvs0NLS_TIME_TZ_FORMAT                                           HH.MI.SSXFF AM TZR
:itho/@L-vrJ0NLS_TIMESTAMP_TZ_FORMAT                                      DD-MON-RR HH.MI.SSXFF AM TZR
.|#g2G\ ygq0NLS_DUAL_CURRENCY                                            $
;ZiX&x{^W0NLS_COMP                                                     BINARY
;L9s.In8z?x0NLS_LENGTH_SEMANTICS                                         BYTEITPUB个人空间+M5P%N1H YY;Q:\
NLS_NCHAR_CONV_EXCP                                          FALSE
17 rows selected.ITPUB个人空间l6YJ ]8Rx%M3@
select * from v$nls_parameters生成的结果比使用ITPUB个人空间q*A-].}'k K-k$zX i
select * from nls_session_parameters
Y)]-?d8[R }5wRy%K0多了2行数据库字符集的信息
 
一旦连接后,就可以用alter session命令来更改会话级的设置
`xc9@"kcS0常用的修改命令如下
l0{X io.Q$KM bvE0SQL> alter session set nls_date_format='dd.mm.yyyy';
TJ `k%A~(H0Session altered.ITPUB个人空间.Lp:[2Vo7b
SQL> execute dbms_session.set_nls('nls_date_format','''dd.mm.yyyy''');ITPUB个人空间0qPl}0T3Mu
PL/SQL procedure successfully completed.

6Fm/v$M;j:N0以上2个命令更改的效果是等效的
注意事项:ITPUB个人空间Z;P&HJF"S`nnh
A.nls_session_parameters依赖于客户端nls_lang的设定
z&P+sK5kAg4NyZmM0B.如果客户端没有设定nls_lang,nls_session_parameters将使用nls_instance_parameters的值ITPUB个人空间c[9?Crb
C.如果设定了参数,NLS_SESSION_PARAMETERS 优先级总要高于NLS_INSTANCE_PARAMETERS 和 NLS_DATABASE_PARAMETERS.ITPUB个人空间7_)MO5{BB$hlq7m
D.无法从服务端控制这个设置的开关,因为客户端的参数优先级总是高于实例段和数据库端的设定ITPUB个人空间 GO@+U+l/n
E NLS_LANG 不能用 ALTER SESSION修改, NLS_LANGUAGE and NLS_TERRITORY 可以. 但是However 
f|g({b7b0Z9E;R0F NLS_SESSION_PARAMETERS 对于其他会话不可见. 如果你想追踪其他会话的值,可以通过logon trigger来记录ITPUB个人空间O"w.{ e#k*D
G session 的NLS_LANGUAGE 也指明用何种语言显示客户端错误信息
Ts})p HY0H 用alter session 命令修改,不能用sql脚本  "set"  NLS 参数
五、SQL语句级
语句级的设置是优先级最高的,通过在sql语句利用函数来实现,如
"Z!K(ki2d*T0SQL> select to_char(sysdate,'yyyy month dd day','nls_date_language=american') as
f [ }}9b-Vb3tan0 american,to_char(sysdate,'yyyy month dd day','nls_date_language=german') as german from dual;
AMERICAN                    GERMANITPUB个人空间z.O7~'d%[ Zge
--------------------------- ----------------------------ITPUB个人空间-me(o/OL
2008 april     23 wednesday 2008 april     23 mittwoch
SQL> select to_char(sysdate,'yyyy month dd day') from dual;
TO_CHAR(SYSDATE,'YYYYMONTHD
V0D$r3eR8Ig8u0---------------------------
!Q_hg6d02008 april     23 wednesday
可以看到,语句级的nls更改,并没有影响到session的nls设置
 
总结下,SQL STATEMENT > SESSION > CLIENT SETTING > INSTANCE > DATABASE
 
补充2个常用的SQL语句
1 select userenv('lang') from dual;ITPUB个人空间/W.{]4wf{$]A:WE
        显示session的<language>的缩写ITPUB个人空间 ?Ske)g$a |
2 select userenv('language') from dual;和select sys_context('userenv','language') from dual;ITPUB个人空间|%mb g0x W]
    显示session的<Language>_<territory> and 数据库的 character set.

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-12-05  
 123456
78910111213
14151617181920
21222324252627
28293031   

数据统计

  • 访问量: 1283
  • 日志数: 23
  • 建立时间: 2007-12-29
  • 更新时间: 2008-07-07

RSS订阅

Open Toolbar