--==========================
-- Oracle 全球化特性与字符集
--==========================
数据库的全球化特性是数据库发展的必然结果,位于不同地区、不同国家、不用语言而使用同一数据库越来越普遍。Oracle数据库提供
了对全球化数据库的支持,消除不同文字、语言环境、历法货币等所带来的差异、使得更容易、更方便来使用数据库。
一、Oracle全球化特性
Oracle全球化特性包括
Language support
Territory support
Character set support
Linguistic sorting
Message support
Date and time formats
Numeric formats
Monetary formats
在Oracle全球化特性中最重要的则是字符集,即使用何种字符集将数据存储在数据库中
二、什么是字符集
1.定义
主要是讨论两个问题,一是字符如何存储,二是如何字符显示
简单的说就是输入的数据、字符、符号等如何存储到到计算机并将其翻译出来,而此处则是存储到数据库系统内。
比如英文的个英文字符、个阿拉伯数据字,#、$等。美国ANSI则使用了一个单字节(7位)来表示了使用的标准字符集
由于世界各国和各个地区使用的符号的多样性,而单字节仅仅能表示个字符,因此就有使用到了多字节来表示各自不同的字符
正是由于上述原因,因此产生了不同的字符集的概念,如美国使用的为US7ASCII,西欧则使用的是WE8ISO8859P1,中国则是ZHS16GBK
同时,为了统一世界各国字符编码,统一编码字符集的概念应运而生,这就是Unicode。
在Oracle中,几种常用的Unicode为UTF-8,AL16UTF8,AL32UTF8
2.Oracle所支持的字符集及分类
Oracle支持两百多种字符集,包含了单字节、可变字节以及通用字符集等。
字符集通常根据说使用的字节数来分类,通常分为以下几类
a.单字节字符集,如US7ASCII(7bit),WE8ISO8859P1(8bit),WE8DEC(8bit)
b.可变长度字符集,如JA16SJIS,ZHT16HKSCS
c.通用字符集,如AL32UTF8
3.UTF-8、UTF-16、UTF8、AL32UTF8、AL16UTF8
上述是几个经常容易混淆的概念,在此有必要做一下说明
UTF-8、UTF-16、UCS-2是标准的Unicode字符集,即是使用UTF-8或UTF-16或UCS-2来实现编码
UTF8指的是Oracle中的字符集,使用UTF-8来编码
AL32UTF8、AL16UTF8是Oracle数据库中使用基于标准Unicode字符集编码而定义的Unicode字符集
下面主要说明一下AL32UTF8、AL16UTF8
AL32UTF8
是一个bit的Unicode字符编码,使用UTF-8来实现编码
支持可变长编码,是ASCII码的严格超集,即ASCII字符集中表示字符码值与AL32UTF8中完全相同
该字符集支持1-4字节可变长度编码,对欧洲使用的字符通常用1-2个字节,对于亚洲则使用3个字节,即一个汉字使用3个字节表示
对于增补的特殊符号,则使用个字节来表示
AL16UTF8
是一个bit的Unicode字符编码,使用UTF-16来实现编码
使用固定长度来表示字符,通常使用个字节来实现
该字符集通常适用于欧洲和亚洲国家,因为个字节足以满足这些字符的码点需求
对于增补的特殊符号,AL16UTF8则使用个字节来实现
对于AL16UTF8中的字符,要么使用个字节,要么是个字节来表示
Oracle数据库支持的Unicode字符集
Character Set Unicode Encoding Database Character Set National Character Set
UTF8 UTF-8 Yes Yes(Oracle 9i and 10g only)
AL32UTF8 UTF-8 Yes No
AL16UTF16 UTF-16 No Yes
4.字符集影响的数据类型
对于二进制数据类型,字符集的设置不影响该类型数据的存储,如视频、音频等
影响的数据类型为:char,varchar2,nchar,nvarchar2,blob,clob,long,nclob
三、相关NLS参数的设定
1.查看NLS参数
a.本次会话中设定及使用的NLS参数(nls_session_parameters)
select * from nls_session_parameters;
SQL> col parameter format a28
SQL> col value format a35
SQL> select * from nls_session_parameters;
PARAMETER VALUE
---------------------------- -----------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
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
PARAMETER VALUE
---------------------------- -----------------------------------
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
b.查看数据库中设定的NLS参数
select * from nls_database_parameters;
c.查看基于实例设定的NLS参数
select * from nls_instance_parameters;
2.设定nls_language参数
设定nls_language影响的内容
NLS_LANGUAGE AMERICAN --只要设定该参数则下面的参数即可确定
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
--下面查看nls_language参数以及设定不同的nls_language所带来的影响
SQL>select * from nls_session_parameters where parameter='NLS_LANGUAGE';
PARAMETER VALUE
---------------------------- -----------------------------------
NLS_LANGUAGE AMERICAN
SQL> select empno,ename,round(sal*1.35,2) sal,hiredate from emp where sal<1200;
EMPNO ENAME SAL HIREDATE
---------- ---------- ---------- ---------
7369 SMITH 1080 17-DEC-80
7876 ADAMS 1485 23-MAY-87
7900 JAMES 1282.5 03-DEC-81
SQL> alter session set nls_language='ITALIAN'; --将nls_language设定为ITALIAN
Session altered.
--再次执行上面的查询语句可以看出日期月份的表示发生了变化
SQL> select empno,ename,round(sal*1.35,2) sal,hiredate from emp where sal<1200;
EMPNO ENAME SAL HIREDATE
---------- ---------- ---------- ---------
7369 SMITH 1080 17-DIC-80
7876 ADAMS 1485 23-MAG-87
7900 JAMES 1282.5 03-DIC-81
3.设定nls_territory参数
设定nls_territory影响的内容
NLS_TERRITORY AMERICA --只要设定该参数则下面的参数即可确定
NLS_CURRENCY $
NLS_DUAL_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_DATE_FORMAT DD-MON-RR
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
SQL> alter session set nls_language='ENGLISH'; --将nls_language设置为英语
Session altered.
--在设定为英语后执行查询可以看出查询结果同美语是一样的
SQL> select empno,ename,round(sal*1.35,2) sal,hiredate from emp where sal<1200;
EMPNO ENAME SAL HIREDATE
---------- ---------- ---------- ---------
7369 SMITH 1080 17-DEC-80
7876 ADAMS 1485 23-MAY-87
7900 JAMES 1282.5 03-DEC-81
SQL> alter session set nls_territory='CANADA'; --将nls_territory设置为加拿大
Session altered.
--将nls_territroy设置为加拿大后,日期发生了变化,小数位符号也发生了变化
SQL> select empno,ename,round(sal*1.35,2) sal,hiredate from emp where sal<1200;
EMPNO ENAME SAL HIREDATE
---------- ---------- ---------- --------
7369 SMITH 1080 80-12-17
7876 ADAMS 1485 87-05-23
7900 JAMES 1282,5 81-12-03
SQL> alter session set nls_territory='AUSTRALIA'; --保留nls_language不变,即为英语,将地区改为AUSTRALIA
Session altered.
--从下面的查询可以看到日期部分发生了变化
SQL> select empno,ename,round(sal*1.35,2) sal,hiredate from emp where sal<1200;
EMPNO ENAME SAL HIREDATE
---------- ---------- ---------- ---------
7369 SMITH 1080 17/DEC/80
7876 ADAMS 1485 23/MAY/87
7900 JAMES 1282.5 03/DEC/81
关于nls_language和nls_territory参数的总结
为nls_language设定了不同的值,则影响了日期的表示方法排序等
通常,在nls_language设定后,应为nls_territory设定合理的值,假如语言设定为简体中文,地区设定为澳大利亚则不太合理
对于使用同样的语言不同国家或地区,比如英语,澳大利亚和英国,则nls_territory设定不同,则同样影响相关参数如currency等
两个参数所影响的具体值请参考前面部分的描述及演示
4.NLS_LANG参数的设定
NLS_LANG为一个总控参数,控制了前面描述的nls_language和nls_territory的行为
该参数可以用于设定服务器和客户端的language和territory值,也可设置客户端输入数据和显示的字符集
只要设定了该参数,则其它参数就确定了。当然也可以只设定其中的一部分,NLS_LANG只能在环境变量中设定。
该参数的格式为:NLS_LANG = language_territory.charset 如:NLS_LANG=French_France.UTF8
NLS_LANG设定后,在客户端应用程序启动时生效。当连接到服务器端时,客户端使用NLS_LANG指定的信息与
Oracle服务器段来通信,该设置通常对Oracle提供的客户端有效,如SQLPlus等
在参数NLS_LANG=French_France.AL32UTF8,该参数分为个部分来设定
第一部分为language,如示例中为French。
第二部分为territory,如示例中为France。一二部分必须用下划线连接
第三部分为character set,如示例中为AL32UTF8 二三部分必须用小数点连接
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow