1、全球化特性
1.1、字符集
字符集(charcater set)是一种用于将字符表示为比特序列的定义编码模式。它由许多已定义的不同字符组成。
我们至少需要大写字母、小写字母、0~9的数字、某些标点符号以及特殊的字符。一个7比特字符集能够表示的字符总数为127(27);8比特字符集能够表示256(28)个不同的字符。
1.2、语言支持
Oracle所支持的语言种类取决于平台、版本以及产品的补丁程序级别。为了决定任何一个安装软件的可用范围,查以查询V$NLS_VALID_VALUES视图。
SQL> select * from v$nls_valid_values 2 where parameter = 'LANGUAGE'; PARAMETER VALUE ISDEP ---------- ---------- ----- LANGUAGE AMERICAN FALSE LANGUAGE GERMAN FALSE LANGUAGE FRENCH FALSE LANGUAGE BENGALI TRUE ...... 64 rows selected. |
Oracle使用的语言决定了显示错误消息的语言,并且设置了默认的日期语言与排序顺序。
与Oracle使用的语言相关的默认值
变量 | 默认值 | 用途 |
NLS_LANGUAGE | AMERICAN | 显示错误消息的语言 |
NLS_DATE_LANGUAGE | AMERICAN | 用于日期与月份名 |
NLS_SORT | BINARY | 语言排序顺序 |
1.3、地区支持
选中某个地区可以默认设置许多全球化特性。为了确定数据库所支持的地区,同样可以查询V$NLS_VALID_VALUES视图。
SQL> select * from v$nls_valid_values 2 where parameter = 'TERRITORY'; PARAMETER VALUE ISDEP ---------- ---------- ----- TERRITORY AMERICA FALSE TERRITORY GERMANY FALSE TERRITORY FRANCE FALSE TERRITORY CANADA FALSE TERRITORY SPAIN FALSE TERRITORY ITALY FALSE ...... 96 rows selected. |
选择地区还可以默认设置日期和周的编号、收支符号、日期格式、小数点分隔符与组分隔符以及货币符号。下面给出与地区相关的设置的默认值。
与地区相关的设置的默认值
变量 | 默认值/用途 |
NLS_TERRITORY | AMERICA / 地理位置 |
NLS_CURRENCY | $ / 当地货币符号 |
NLS_DUAL_CURRENCY | $ / 指定地区次要货币符号 |
NLS_ISO_CURRENCY | AMERICA / 指定ISO地区货币符号 |
NLS_DATE_FORMAT | DD-MM-RR / DATE数据类型列所使用的格式 |
NLS_NUMERIC_CHARACTERS | ., / 小数点分隔符与组分隔符 |
NLS_TIMESTAMP_FORMAT | DD-MM-RRHH.MI.SSXFF AM / 是TIMESTAMP数据类型列所使用的格式 |
NLS_TIMESTAMP_TZ_FORMAT | DD-MM-RRHH.MI.SSXFF AM TZR / 是TIMESTAMP WITH LOCAL TIMEZONE数据类型列所使用的格式 |
SQL> alter session set nls_territory = 'AMERICA'; Session altered. SQL> select systimestamp from dual; SYSTIMESTAMP ------------------------------------------------------------ 16-OCT-08 12.24.59.641297 AM +08:00 SQL> alter session set nls_territory = 'GERMANY'; Session altered. SQL> select systimestamp from dual; SYSTIMESTAMP ------------------------------------------------------------ 16.10.08 00:25:28,960439 +08:00 SQL> alter session set nls_territory = 'CHINA'; Session altered. SQL> select systimestamp from dual; SYSTIMESTAMP ------------------------------------------------------------ 16-OCT-08 12.26.03.817205 AM +08:00 |
2、使用全球化支持功能
可以在下列任意级别上或所有5个级别上指定全球化。
这些级别按从低到高的优先级顺序列出。
须要记住能够指定全球化的各种级别的优先顺序。在服务器端,实例设置优先于数据库设置,但是服务器上的所有相关设置都会被客户端重写,从低到高的级别优先顺序为:客户端环境、会话级别、语句级别。
2.1、选择字符集
在数据库创建阶段,选择字符集是我们需要作出的最重要的两个决定之一。创建阶段中必须正确完成的两个设置,DB_BLOCK_SIZE参数(这个参数值绝对不能改变)与数据库字符集(理论上可以被改变,事实上不可行)。
2.2、改变数据库字符集
Oracle提供了上列两种有助于决定字符集修改的工具:数据库字符集扫描程序(Database Character Set Scanner)和语言与字符集文件扫描程序(Language and Character Set File Scanner)。
######################################### # 感觉不是太重要应该,以后重要再学吧 # 测试时候报错 # csscan: error while loading shared libraries: libclntsh.so.10.1: # cannot open shared object file: No such file or directory ######################################### csscan system/liguanghu full=y tochar=utf8 |
以SYSTEM连接数据库,通过扫描所有数据文件来查看转换至UTF8是否会导致若干问题。为了使数据库能够运行数据库字符集扫描程序,必须首先运行csminst.sql脚本。
判断能够无损地改变数据库字符集后,可以通过执行ALTER DATABASE CHARACTER SET …命令来完成字符集的修改。
2.3、数据库内的全球化
在数据库创建阶段,根据执行CREATE DATABASE命令以及指定字符集所影响的实例参数就可以确定数据库的全球化设置。
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 WE8ISO8859P1 NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE AMERICAN NLS_SORT BINARY NLS_TIME_FORMAT HH.MI.SSXFF AM PARAMETER VALUE ------------------------------ ------------------------------------- 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 10.2.0.1.0 20 rows selected. |
2.4、实例级别的全球化
实例参数设置会重写数据库设置。在RAC环境中,不同的实例可以具有不同的设置。全球化参数是静态的。
2.5、客户端环境设置
NLS_LANG是一个关键的环境变量。完整规范包括语言、地区以及字符集。
2.6、会话级别的全球化设置
一旦完成连接,用户就可以通过执行ALTER SESSION命令来建立自己的全球化首选项。补充软件包DBMS_SESSION可以代替ALTER SESSION命令。
SQL> alter session set nls_date_format = 'dd.mm.yyyy'; Session altered. SQL> select sysdate from dual; SYSDATE ---------- 16.10.2008 SQL> execute dbms_session.set_nls('nls_date_format','''yyyy-MM-dd'''); PL/SQL procedure successfully completed. SQL> select sysdate from dual; SYSDATE ---------- 2008-10-16 |
2.7、语句级别的全球化设置
全球化设置的最优控制级别是在语句内进行编程控制,此时必然会在SQL函数中使用NLS参数。
SQL> select 2 to_char(hiredate,'Day dd, Month YYYY', 'NLS_DATE_LANGUAGE=DUTCH'), 3 to_char(hiredate,'Day dd, Month YYYY', 'NLS_DATE_LANGUAGE=GERMAN') 4 from scott.emp; TO_CHAR(HIREDATE,'DAYDD,MONT TO_CHAR(HIREDATE,'DAYDD,MONTH ---------------------------- ----------------------------- Woensdag 17, December 1980 Mittwoch 17, Dezember 1980 Vrijdag 20, Februari 1981 Freitag 20, Februar 1981 Zondag 22, Februari 1981 Sonntag 22, Februar 1981 Donderdag 02, April 1981 Donnerstag 02, April 1981 Maandag 28, September 1981 Montag 28, September 1981 Vrijdag 01, Mei 1981 Freitag 01, Mai 1981 Dinsdag 09, Juni 1981 Dienstag 09, Juni 1981 Zondag 19, April 1987 Sonntag 19, April 1987 Dinsdag 17, November 1981 Dienstag 17, November 1981 Dinsdag 08, September 1981 Dienstag 08, September 1981 Zaterdag 23, Mei 1987 Samstag 23, Mai 1987 |
SQL函数是能够在数据类型之间进行转换的类型强制转换函数。根据所使用的类型强制转换函数可以使用各种参数。
各种SQL函数及其参数
函数 | 全球化参数 |
TO_DATE | NLS_DATE_LANGUAGE NLS_CALENDAR |
TO_NUMBER | NLS_NUMBER_CHARACTERS NLS_CURRENCY NLS_DUAL_CURRENCY NLS_ISO_CURRENCY NLS_CALENDAR |
TO_CHAR,TO_NCHAR | NLS_DATE_LANGUAGE NLS_NUMBERIC_CHARACTERS NLS_CURRENCY NLS_DUAL_CURRENCY NLS_ISO_CURRENCY NLS_CALENDAR |
3、语言排序与选择
Oracle默认使用二进制排序。要排序的串从左至右被读取,并且每个字符都简化为它的ASCII(或EBCDIC)数字值。
4、Locale Builder
Locale Builder是一个图形工具,这个工具能够通过为语言、地区、字符集以及语言排序生成定义而创建自定义的全球化环境。
$ $ORACLE_HOME/nls/lbuilder/lduilder |
5、使用时区
使用CREATE DATABASE命令创建数据库时能设置数据库时区,之后可以使用ALTER DATABASE SET TIME_ZONE = …命令进行调整。没有设置,默认为主机操作系统的时区。客户机时区默认为客户机操作系统的时区,此外使用ORA_STDZ环境变量也可以设置客户机时区。会话内,全用ALTER SESSION SET TIME_ZONE = …命令也可以设置时区。