这部分是属于oracle全球化支持的内容,详细了解可以参考文档http://docs.oracle.com/cd/E11882_01/server.112/e10729/whatsnew.htm#NLSPG000
首先谈一下数据库字符集,我们用dbca建库的时,会让你选择数据库字符集,默认的就是基于操作系统的语言设置:
[oracle@localhost ~]$ echo $LANG;
zh_CN.UTF-8
SQL> select userenv('language') from dual
2 ;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.AL32UTF8
首先谈一下数据库字符集,我们用dbca建库的时,会让你选择数据库字符集,默认的就是基于操作系统的语言设置:
[oracle@localhost ~]$ echo $LANG;
zh_CN.UTF-8
2 ;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.AL32UTF8
从oracle启动的alert日志里也可以看出数据库字符集:
Database Characterset is AL32UTF8
从视图 nls_database_parameters 也可以看出
当然我们可以修改数据库字符集(但有限制。不建议修改):
只有新的字符集是当前字符集的超集时才能修改数据库字符集,例如UTF8是US7ASCII的超集,修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8
客户端字符集环境
select * from nls_instance_parameters
其来源于v$parameter,表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
会话字符集环境
select * from nls_session_parameters
来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,session会话里设置的字符集只是在此session里有效,session结束后,就失效了。如果会话没有特殊的设置,将与nls_instance_parameters一致。
客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,NLS作用优先级别:字符设置函数 > alter session > 环境变量或注册表 > 参数文件 > 数据库默认参数
字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
下面着重讲解客户端字符集设置:
linux下:
[oracle@localhost ~]$ export LANG=zh_CN.UTF-8
Windows环境:
注册表:
regedit =>HKEY_LOCAL_MACHINE =>SOFTWARE =>ORACLE-HOME
NLS_LANG:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
NLS_LANG可以分为三部分:
language:语言 SIMPLIFIED CHINESE
territory:地区 CHINA
character set :字符集 ZHS16GBK
NLS_LANG=<language>_<territory>.<client character set>
各个参数所带来的影响:
Language: 显示oracle消息,校验,日期命名
Territory:指定默认日期、数字、货币等格式
Client character set:指定客户端将使用的字符集
select * from v$nls_valid_values 这个视图很有用,你可以查到oracle支持所有的上面的三个参数
Database Characterset is AL32UTF8
从视图 nls_database_parameters 也可以看出
当然我们可以修改数据库字符集(但有限制。不建议修改):
只有新的字符集是当前字符集的超集时才能修改数据库字符集,例如UTF8是US7ASCII的超集,修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8
客户端字符集环境
select * from nls_instance_parameters
其来源于v$parameter,表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
会话字符集环境
select * from nls_session_parameters
来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,session会话里设置的字符集只是在此session里有效,session结束后,就失效了。如果会话没有特殊的设置,将与nls_instance_parameters一致。
客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,NLS作用优先级别:字符设置函数 > alter session > 环境变量或注册表 > 参数文件 > 数据库默认参数
字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
下面着重讲解客户端字符集设置:
linux下:
[oracle@localhost ~]$ export LANG=zh_CN.UTF-8
注册表:
regedit =>HKEY_LOCAL_MACHINE =>SOFTWARE =>ORACLE-HOME
NLS_LANG:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
NLS_LANG可以分为三部分:
language:语言 SIMPLIFIED CHINESE
territory:地区 CHINA
character set :字符集 ZHS16GBK
NLS_LANG=<language>_<territory>.<client character set>
各个参数所带来的影响:
Language: 显示oracle消息,校验,日期命名
Territory:指定默认日期、数字、货币等格式
Client character set:指定客户端将使用的字符集
select * from v$nls_valid_values 这个视图很有用,你可以查到oracle支持所有的上面的三个参数