字符集 Oracle数据库软件有自己的字符集,不依赖于主机操作系统的字符集。 Oracle支持数百种字符集,我们在建立数据库时应该充分考虑实际业务需求,从而选择合适的字符集。 比如,我们确定数据库只是中国人来用,那么就可以选择ZHS16GBK字符集。语言支持 查询v$nls_valid_values视图:--查询数据库语言支持情况select * from v$nls_valid_values where parameter="LANGUAGE";可以看到结果中支持很多语言,比如SIMPLIFIED CHINESE,TRADITIONAL CHINESE,JAPANESE等。Oracle默认排序规则是BINARY,同时Oracle还提供了很多排序规则供用户选择:--查询数据库排序支持情况select * from v$nls_valid_values where parameter="SORT";地区支持 查询数据库支持的地区:--查询数据库地区支持情况select * from v$nls_valid_values where parameter="TERRITORY";结果可以看到很多支持的地区,比如CHINA,CANADA,FRANCH等。选中某个地区可以默认设置许多全球化特性。
1.2 使用全球化支持功能
可以在任意级别上指定全球化(优先级由低->高):数据库、实例、客户端环境、会话、语句。
1.2.1 选择字符集
前面说过,如果我们确定数据库只是中国人来用,那么就可以选择ZHS16GBK字符集。 同样,如果要存储法语和西班牙语,就可以选择Western European字符集;如果要存储俄语或者捷克语数据,就应该选择Eastern European字符集。数据库字符集用于存储varchar2、clob、char、long数据类型列中的所有数据。 8.0版本后,Oracle引入了National Character Set,即数据库的第二个字符集,它用于存储nvarchar2, nclob, nchar数据类型的数据。 9i版本后,Oracle的National Character Set只能为Unicode字符集,有两种选择AL16UTF16和UTF8.选择哪个要考虑nvarchar2数据类型中实际要存储的数据类型,如果大部分数据可以表示为一个字节,选择UTF8;反之选择AL16UTF16。如果实际应用表中用不到nvarchar的数据类型,这个选择没有意义。
1.2.2 改变数据库字符集
在9i版本之前,无法改变数据库字符集,从9i版本开始,虽然可以改字符集,但无法保证这种方法有效。 可以使用csscan和lcsscan工具来帮助决定字符集是否能够修改(必须首先运行csminst.sql脚本)。 确定可以无损改变数据库字符集后,就可以通过执行alter database character set..命令来完成字符集的修改。 命令本身要求目标字符集必须是原始字符集的一个超集,但不能保证不存在问题。
1.2.3 数据库中的全球化
数据库级别的全球化设置。--查询NLS_DATABASE_PARAMETERS视图select * from nls_database_parameters;PARAMETERVALUE------------------------------ --------------------------------------------------------------------------------NLS_LANGUAGE AMERICANNLS_TERRITORYAMERICANLS_CURRENCY $NLS_ISO_CURRENCY AMERICANLS_NUMERIC_CHARACTERS .,NLS_CHARACTERSET ZHS16GBKNLS_CALENDAR GREGORIANNLS_DATE_FORMATDD-MON-RRNLS_DATE_LANGUAGEAMERICANNLS_SORT BINARYNLS_TIME_FORMATHH.MI.SSXFF AMNLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AMNLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZRNLS_TIMESTAMP_TZ_FORMATDD-MON-RR HH.MI.SSXFF AM TZRNLS_DUAL_CURRENCY$NLS_COMP BINARYNLS_LENGTH_SEMANTICS BYTENLS_NCHAR_CONV_EXCPFALSENLS_NCHAR_CHARACTERSET AL16UTF16NLS_RDBMS_VERSION11.2.0.4.020 rows selected.
1.2.4 实例级别的全球化
实例级别的全球化设置,实例参数设置会重写数据库设置。--查询nls_instance_parameters视图select * from nls_instance_parametersPARAMETERVALUE------------------------------ ------------------------------NLS_LANGUAGE AMERICANNLS_TERRITORYAMERICANLS_SORTNLS_DATE_LANGUAGENLS_DATE_FORMATNLS_CURRENCYNLS_NUMERIC_CHARACTERSNLS_ISO_CURRENCYNLS_CALENDARNLS_TIME_FORMATNLS_TIMESTAMP_FORMATNLS_TIME_TZ_FORMATNLS_TIMESTAMP_TZ_FORMATNLS_DUAL_CURRENCYNLS_COMP BINARYNLS_LENGTH_SEMANTICS BYTENLS_NCHAR_CONV_EXCPFALSE17 rows selected.
为了实现业务必须在多个时区之间正常运转的功能,需要指定数据库所运作的时区以及使用TIMESTAMP WITH TIME ZONE与TIMESTAMP WITH LOCAL TIME ZONE数据类型。 实验:调整时区 --1.sqlplus连接到实例--2.确定数据库时区select property_value from database_properties where property_name="DBTIMEZONE";PROPERTY_VALUE------------------------------------------------------------------------------------------------------------------------00:00--3.创建表create table times(date_std date,date_tz timestamp with time zone,date_ltz timestamp with local time zone);--4.查看支持的所有时区:select * from v$timezone_names;--5.将会话时区调整为某个不同于数据库时区的时区--将会话时区设定为美国夏威夷:alter session set time_zone="US/Hawaii";--6.调整会话的时区/时间格式alter session set nls_timestamp_tz_format="YYYY-MM-DD HH24:MI:SS TZD";alter session set nls_timestamp_format="YYYY-MM-DD HH24:MI:SS";alter session set nls_date_format="YYYY-MM-DD HH24:MI:SS";--7.表中插入一条记录insert into times values("2016-02-03 15:00:00","2016-02-03 15:00:00","2016-02-03 15:00:00");commit;--8.查看时间select * from times;SQL> select * from times;DATE_STDDATE_TZDATE_LTZ------------------- -------------------------------------------------- ---------------------------------------------------------------------------2016-02-03 15:00:00 2016-02-03 15:00:00 HST2016-02-03 15:00:00--9.会话切换至数据库时区:alter session set time_zone=DBTIMEZONE;--10.再次查看时间,发现timestamp with local time zone数据类型对应的时间自动调整了select * from times;SQL> select * from times;DATE_STDDATE_TZDATE_LTZ------------------- -------------------------------------------------- ---------------------------------------------------------------------------2016-02-03 15:00:00 2016-02-03 15:00:00 HST2016-02-04 01:00:00更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址