一、数据库级的参数设定
先查看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.
【不错】浅析Oracle三层全球化支持(NLS)