一、自定义数据库和各个会话的语言相关行为

二、使用数据库和NLS字符集

Reference

一、自定义数据库和各个会话的语言相关行为

1.1 全球化功能

**字符集**
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; 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 11.2.0.4.0 20 rows selected.

1.2.4 实例级别的全球化

实例级别的全球化设置,实例参数设置会重写数据库设置。

--查询nls_instance_parameters视图
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 BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE 17 rows selected.

1.2.5 客户端环境设置

一般我们项目常用的在客户端环境变量中配置的两个参数:

NLS_LANG
NLS_DATE_FORMAT

/bin/bash环境:

export NLS_LANG="simplified chinese_china.ZHS16GBK"
export NLS_DATE_FORMAT="YYYY-MM-DD HH24:Mi:SS"

/bin/csh环境:

setenv NLS_LANG "simplified chinese_china.ZHS16GBK"
setenv NLS_DATE_FORMAT "YYYY-MM-DD HH24:Mi:SS"

注意:DBA不能控制终端用户对NLS_LANG环境变量的设置。如果应用程序容易受到全球化的影响,那么开发人员就应该考虑到这个问题,同时在会话内控制全球化设置。

服务器端与客户端全球化设置之间的转换由Oracle Net完成。如果客户端与服务器使用不同的字符集,那么就可能无法完成数据的转换。

1.2.6 会话级别的全球化设置

会话级别的规范优先于服务器端数据库与实例级别的设置,而且会重写用户使用环境变量配置其会话的各种尝试。

设定nls_date_format

--第一种方法
alter session set nls_date_format='YYYY-MM-DD HH24:Mi:SS';
--第二种方法
exec dbms_session.set_nls('nls_date_format','''dd.mm.yyyy'''); --实验验证:
SQL> alter session set nls_date_format='YYYY-MM-DD';
Session altered. SQL> select sysdate from dual;
SYSDATE
----------
2016-02-03 SQL> exec dbms_session.set_nls('nls_date_format','''dd.mm.yyyy''');
PL/SQL procedure successfully completed. SQL> select sysdate from dual;
SYSDATE
----------
03.02.2016

查看v$nls_parameters或者nls_session_parameters视图查看当前作用于会话的全球化设置:

select * from v$nls_parameters;
select * from nls_session_parameters; SQL> select * from v$nls_parameters; PARAMETER VALUE
------------------------------ ------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
NLS_CURRENCY ¥
NLS_ISO_CURRENCY CHINA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT YYYY-MM-DD HH24:Mi:SS
NLS_DATE_LANGUAGE SIMPLIFIED CHINESE
NLS_CHARACTERSET ZHS16GBK
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_NCHAR_CHARACTERSET AL16UTF16
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE 19 rows selected. --查询nls_session_parameters,没有字符集信息
SQL> select * from nls_session_parameters; PARAMETER VALUE
------------------------------ ------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
NLS_CURRENCY ¥
NLS_ISO_CURRENCY CHINA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT YYYY-MM-DD HH24:Mi:SS
NLS_DATE_LANGUAGE SIMPLIFIED CHINESE
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.

1.2.7 语句级别的全球化设置

全球化设置的最优控制级别是在每个SQL语句内进行编程控制,此时必然会在SQL函数中使用NLS参数。

比如:

--分别用英语,简体中文,日语显示职员的入职日期及星期:
select to_char(HIREDATE,'Day dd, Month YYYY','NLS_DATE_LANGUAGE=AMERICAN') "English",
to_char(HIREDATE,'Day dd, Month YYYY','NLS_DATE_LANGUAGE=''SIMPLIFIED CHINESE''') "Chinese",
to_char(HIREDATE,'Day dd, Month YYYY','NLS_DATE_LANGUAGE=JAPANESE') "Japanese"
from scott.emp; SQL> select to_char(HIREDATE,'Day dd, Month YYYY','NLS_DATE_LANGUAGE=AMERICAN') "English",
2 to_char(HIREDATE,'Day dd, Month YYYY','NLS_DATE_LANGUAGE=''SIMPLIFIED CHINESE''') "Chinese",
3 to_char(HIREDATE,'Day dd, Month YYYY','NLS_DATE_LANGUAGE=JAPANESE') "Japanese"
4 from scott.emp; English Chinese Japanese
------------------------------------ ------------------------- -------------------------
Wednesday 17, December 1980 星期三 17, 12月 1980 水曜日 17, 12月 1980
Friday 20, February 1981 星期五 20, 2月 1981 金曜日 20, 2月 1981
Sunday 22, February 1981 星期日 22, 2月 1981 日曜日 22, 2月 1981
Thursday 02, April 1981 星期四 02, 4月 1981 木曜日 02, 4月 1981
Monday 28, September 1981 星期一 28, 9月 1981 月曜日 28, 9月 1981
Friday 01, May 1981 星期五 01, 5月 1981 金曜日 01, 5月 1981
Tuesday 09, June 1981 星期二 09, 6月 1981 火曜日 09, 6月 1981
Sunday 19, April 1987 星期日 19, 4月 1987 日曜日 19, 4月 1987
Tuesday 17, November 1981 星期二 17, 11月 1981 火曜日 17, 11月 1981
Tuesday 08, September 1981 星期二 08, 9月 1981 火曜日 08, 9月 1981
Saturday 23, May 1987 星期六 23, 5月 1987 土曜日 23, 5月 1987
Thursday 03, December 1981 星期四 03, 12月 1981 木曜日 03, 12月 1981
Thursday 03, December 1981 星期四 03, 12月 1981 木曜日 03, 12月 1981
Saturday 23, January 1982 星期六 23, 1月 1982 土曜日 23, 1月 1982 14 rows selected.

二、使用数据库和NLS字符集

2.1 语言排序与选择

Oracle默认使用二进制排序,要排序的字符串从左到右读取,并且每个字符都被简化为他的ASCII数字。这种排序方法适用于美国英语,对于其他语言,则有可能不正确。

2.2 Locale Builder

Locale Builder是个图形化的工具,他能通过为语言、地区、字符集以及语言排序生成定义来创建自定义的全球化环境。

2.3 使用时区

为了实现业务必须在多个时区之间正常运转的功能,需要指定数据库所运作的时区以及使用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_STD DATE_TZ DATE_LTZ


2016-02-03 15:00:00 2016-02-03 15:00:00 HST 2016-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_STD DATE_TZ DATE_LTZ


2016-02-03 15:00:00 2016-02-03 15:00:00 HST 2016-02-04 01:00:00

<h1 id="3">Reference</h1>
- OCP 认证考试指南 (1Z0-053)[M]. 清华大学出版社, 2010.

Oracle数据库全球化的更多相关文章

  1. 初识 数据库及Oracle数据库

    一.数据库基本概念二.数据库举例三.Oracle特点四.Oracle版本五.安装Oracle注意事项六.SQL简介七.Select语句 一.数据库基本概念 数据库(Database,DB)数据库管理系 ...

  2. 教你如何阅读Oracle数据库官方文档

    < Ask Oracle官方原创 > Oracle 官方文档 数量庞大,而且往往没有侧重点,让oracle新手看起来很费力.但是,仍有很多Oracle使用者认为任何oracle学习资料都比 ...

  3. ORACLE数据库字符集处理

    简介: ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储.处理和检索数据.利用全球化支持,OR ...

  4. 使用Zabbix监控Oracle数据库

    Orabbix介绍 监控Oracle数据库我们需要安装第三方提供的Zabbix插件,我们先测试比较有名的Orabbix,http://www.smartmarmot.com/product/orabb ...

  5. Oracle 数据库知识汇总篇

    Oracle 数据库知识汇总篇(更新中..) 1.安装部署篇 2.管理维护篇 3.数据迁移篇 4.故障处理篇 5.性能调优篇 6.SQL PL/SQL篇 7.考试认证篇 8.原理体系篇 9.架构设计篇 ...

  6. Oracle数据库该如何着手优化一个SQL

    这是个终极问题,因为优化本身的复杂性实在是难以总结的,很多时候优化的方法并不是用到了什么高深莫测的技术,而只是一个思想意识层面的差异,而这些都很可能连带导致性能表现上的巨大差异. 所以有时候我们应该先 ...

  7. Oracle 数据库语句大全

    Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CH ...

  8. Oracle数据库升级(10.2.0.4->11.2.0.4)

    环境: RHEL5.4 + Oracle 10.2.0.4 目的: 在本机将数据库升级到11.2.0.4 之前总结的Oracle数据库异机升级:http://www.cnblogs.com/jyzha ...

  9. 混合框架中Oracle数据库的还原处理操作

    在较早期的随笔<Oracle如何实现创建数据库.备份数据库及数据导出导入的一条龙操作>粗略介绍了Oracle数据库的备份还原操作,本文想从开发框架的基础上介绍Oracle数据库的脚本或者还 ...

随机推荐

  1. vs2012 打开解决方案崩溃或者点击项目崩溃

    报错: 问题签名:  问题事件名称: CLR20r3 解决方案: 步骤1:开始-->所有程序-->Microsoft Visual Studio 2012-->Visual Stud ...

  2. PHP uniqid 高并发生成不重复唯一ID

    http://www.51-n.com/t-4264-1-1.html PHP uniqid()函数可用于生成不重复的唯一标识符,该函数基于微秒级当前时间戳.在高并发或者间隔时长极短(如循环代码)的情 ...

  3. Public key for mysql....rpm is not installed

    解决方案: 此时导入rpm的签名信息即可,用root登录,执行下面命令(我的linux版本是centos 5.1) 原文地址: http://my.oschina.net/u/555639/blog/ ...

  4. Wishart distribution

    Introduction In statistics, the Wishart distribution is generalization to multiple dimensions of the ...

  5. 安卓动态调试七种武器之离别钩 – Hooking(上)

    安卓动态调试七种武器之离别钩 – Hooking(上) 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的 ...

  6. Box-sizing:小身材,大拳头!

    国庆回来,很久没写博客了.一来是自己毫无时间,二是最近开发任务特别紧,三是节后综合症,脑子一片空白没有找到写作的原材料.今天,在加完班回来的22点,忙里偷闲,分享一下最近学到的一个小知识点如题.标题的 ...

  7. 元素的click与dblclick

    JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间,是用户或浏览器自身执行的某种动作.诸如click.load.mousemover,都是事 ...

  8. 一个App完成入门篇(六)- 完成通讯录页面

    第五章和第六章间隔时间有点长,对不起大家了.下面继续. 本节教程将要教会大家如何加载本地通讯录. 导入项目 导入通讯录 自定义js模块 发送和订阅page消息 将要学习的demo效果图如下所示 1. ...

  9. 仿花田:相亲网站 意中人 已在GitHub上开源

    在园友的强烈呼唤下,我还是负责任的分享给大家,因为对代码比较熟悉一下,还是有些问题要说明,不然别人看起来会比较费劲.说实话除了这个bootstrap的界面风格和这件事情本身对大家有吸引力之外,内部的逻 ...

  10. 企业IT管理员IE11升级指南【5】—— 不跟踪(DNT)例外

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...