OCP043学习笔记10.doc
上一篇 / 下一篇 2008-09-27 16:59:15 / 个人分类:里程
第十章 理解全球化支持
目标
使用全球化支持
为数据库和单个会话定制语言相关行为
区分不同的查询语号
使用日期时间数据类型
使用不分大小写和不区分重音的搜索进行数据查询
获取全球化支持配置信息
时间数据类型(datetime datatype)
多语言排序(linguistic sorts)
字符定义(Character semantics)
全球化支持概览
全球化提供了用来存储多语言数据的字符集和数据类型
它确保日期、时间、货币、数值和日历数据将遵从任何支持的地区约定并且能恰当显示
它提供了转换成许多不同语言的使用程序和错误信息
它还提供了使用正确的语言规则对多语言数据进行排序和查询的内部功能
全球化支持特性
不支持的有两种功能:全球化支持不能把文本翻译成不同的语言
全球化支持不能控制多语言文本在客户机如何显示
语言支持
地域支持-----NLS_TERRITORY
语言排序和搜索
字符集和语义
Unicade-----一个支持所有已知书写语言的通用字符集(这里要考虑性能和空间的问题)
日历
地区和日历定制
Builder和NLS Calendar实体程序
全球化支持结构
Oracle National Language Support Runtime Libary(NLSRTL)
NLSRTL提供了一套独立于语言的文字和字符处理功能,以及语言约定操作功能
在数据库启动时,NLSRTL寻找lxlboot.nlb的文件
Lx1boot.nlb----定义了数据库的可用的区域定义集合 -----NLSRTL为了找此文件,会先检查变量ORA_NLS10存在的环境,假如没设置ORA_NLS10变量,则lxlboot.nlb文件的默认位置是在$ORACLE_HOME/nls/data
区域定义文件:Local definition files----语言、区域、字符集、语言排序
模块化设计(每一文件仅包含一种特定区域类型相关的数据)的好处:
仅使用所需的地区集,不会在不必要的地区浪费内存;
地区定义可以混合和匹配使用;
在不影响任何其他文件的情况下,可以修改地区文件;
在不影响现存文件的情况下可以生产新的地区文件。
命名规则:lx10000.nlb lx30000.nlb
Lx --第1.2位 前缀
T 第3位 地区类型:0=语言、1=区域、2=字符集、3=语言排序
Nnn 4-7位 目标ID(in Hex)
.nlb 8-11位 扩展名
Oracle Local Builder
支持多语言应用程序
数据库字符集
建库时指定两个NLS参数:数据库字符集和国家字符集
数据库字符集:默认文本存储的字符集(char、varchar2……以及所有的SQL和PL/SQL文本)
国家字符集:NCHAR、NVARCHAR2和NCLOB数据可变的Unicode字符集合
自动数据转换
有个特例是不会自动转换:严格超集(superset)
解析客户/服务器设置
会话一旦建立,客户会隐含的发出一个alter session语句使得会话NLS环境与客户的NLS环境相匹配
Select sysdate from dual;
Alter session set NLS_LANGUAGE=French;
Select sysdate from dual;
Alter session set NLS_LANGUAGE=Italian;
Select sysdate from dual;
在多语言数据库中使用
Unicode:支持所有书写语言的通用字符集,被编译成UTF-8或UTF-16(国家字符集的时候)
使用NLS参数
全球化选项本质上是设置NLS参数
服务器端:初始化参数
客户端:NLS_LANG
设置NLS参数
类型:
语言和区域参数
日期和时间参数
日历参数
数值、列表和货币参数
长度语义
使用NLS_LANG参数
NLS_LANG是一个为客户定义语言、区域和字符集的客户端环境变量
NLS_LANG=language_territory.characterset
例如:AMERICAN_AMERICA.US7ASCII
FRENCH_CANADA.WE8ISO8859P1
单独设置teritory的话,要写成:_territory,如: _AMERICA
单独设置characterset的话,要写成:.characterset ,如: .US7ASCII
使用语言和区域参数
NLS_LANGUAGE
NLS_TERRITORY
使用日期和时间参数
NLS_DATE_FORMAT 日期格式,MM/DD/YYYY MM-DD-YYYY
NLS_DATE_LANGUAGE 语言,CHINESE Italian
NLS_TIMESTAMP_FORMAT 日期时间格式,MM-DD-YYYY HH24:MI:SS.FF
NLS_TIMESTAMP_TZ_FORMAT 带时区: MM-DD-YYYY HH:MI TZ:TZM
使用日历参数
Gregonrian 格雷戈里历
Persian 波斯历
Thai Budd ha 泰国佛历
Arabic Hijrah
English Hijrah
这些日历包含的信息:
星期的第一天
一年的第一个日历周
一年中的天/月份数目
NLS_CALENDAR -----设置使用那种日历
alter session set NLS_CALENDAR='Gregonrian';
Select sysdate from dual;
使用数值、列表和货币参数
NLS_NUMERIC_CHARACTERS 把小数点和组分隔符(如,千、百万等)元素的字符定义到数值格式表征码(mask)中。
分别以字母D和G表示(9G889G675D67) 9,889,675.67具体看G和D怎么设置
除了以下一些例外,任何一个单字节字符都可以被指定:
1) 小数点字符和组分隔符不能是同一种类型
2) 它们不能是数值型的
3) 它们不能具有数学含义(+.-.<.>)
参数设置时,小数点字符在组分隔符之前
alter session set NLS_NUMERIC_CHARACTERS=',.';
则是:20.313.123,89
alter session set NLS_NUMERIC_CHARACTERS='.,';
则是:123,213,321.78
NLS_LIST_SEPARATOR
客户端设置的,用来指定分隔一个列表中的值的字符
使用限制:
1) 它不能是数值型的
2) 它不能是与数值型或货币型相同的字符
3) 它不能有数学含义(+.-.<.>)
NLS_CURRENCY
表征码中定义了由元素L显示的货币符号
Alter session set NLS_CURRENCY='T';
Select to_char(123.45,'L9G999G999D99) amount from dual; 注意L的位置,如果在数字之后,则结果中,L也是在数字之后
T123.45
该参数不限于单一字符,可以是字符串
NLS_ISO_CURRENCY
防止货币符号中产生模糊的情况,C元素
需要一个有效的区域名称而不是一个文本字符串
Alter session set NLS_ISO_CURRENCY=France;
Select to_char(123.45,'9G999G999D99C') amount from dual;
123.45EUR
使用NLS_LENGTH_SEMANTICS参数
长度语义,默认是BYTE或CHAR
例外现象:
1) NCHAR、NVARCHAR、CLOB和NCLOG不受此参数影响,他们总是定义成CHAR
2) SYS、SYSTEM表空间里的表格不受此参数影响,他们总是定义成BYTE
这只NLS参数的优先级
定义NLS参数的方法:
² 服务器初始化参数
² 客户环境变量
² 使用ALTER SESSION语句
² 在SQL函数中
² 默认值
服务器初始化参数
服务器上的,除非客户端的NLS环境变量优先于它们,否则它们控制着由客户端生成的到服务器的会话
客户环境变量
控制本地客户端的操作(不包含数据库),它们将覆盖客户端生成的服务端的NLS会话设置
$export NLS_LANGUAGE=Frence;
可以alter session完成此功能
使用ALTER SESSION语句
在SQL函数中设置NLS参数
Select to_char(sysdate,'DD/MM/YYYY','nls_date_language=Italian') from dual;
只在该函数中有效
优先权小结
方法 优先级 范围
在SQL函数中设置 1 当前的SQL函数
显式ALTER SESSION语句 2 单前会话
客户环境变量隐式alter session 3 单前会话
由服务器初始化参数设置 4 实例
默认值 5 实例
使用NLS视图
ü NLS_SESSION_PARAMETERS
ü NLS_INSTANCE_PARAMETERS
ü NLS_DATABASE_PARAMETERS
ü V$NLS_VALID_VALUES
导入论坛 引用链接 收藏 分享给好友 推荐到圈子 管理 举报
TAG: ocp读书笔记
-
引用
删除
jusdoi / 2008-09-27 17:01:36
-
使用日期时间数据类型
DATE数据类型
世纪、年、月、日、时、分、秒 ---总是包含时分秒(插入时,如果没有指定,默认是午夜时间(00:00))
Select dump(sysdate) from dual; 世纪和年是数字加100的存储,时分秒是加1存储
Typ=12 len=7:120,104,10,22,12,30,45
实际上的时间是: 2004-10-22 11:29:44
Trunc()函数:取出时分秒显示年月日
Literal--字面值,如:'12-30-2008'
ANSI date literal ---只有日期的字面值,不包含时间,必须格式:date 'YYYY-MM-DD'
To_date
TIMESTAMP数据类型
指定到秒后面的分数
timestamp(2)----2表示分数的精确位数,该值可以0-9之间取
'YYYY-MM-DD HH24:MI:SS:FF'
TIMESTAMP WITH TIME ZONE数据类型
加入了时区 PS:UTC(格林威治时间)
timestamp(4) with time zone ---4表示分数精确位数
TIMESTAMP WITH LOCAL TIME ZONE数据类型
当地时间
使所有时间元素与当地时间同步
使用语言排序和搜索
两个基本的排序:二进制(Binary sorts)和语言(Linguistic sorts)
NLS_SORT
NLS_COMP
V$NLS_VALID_VALUES
不是所有SQL函数功能都支持语言排序
