欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Oracle全球化支持:字符集系统介绍及服务器端、客户端设置

程序员文章站 2024-02-05 20:35:52
...

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 1. 字符集与编码常识 字符集: 人们根据需要把某些字符收集到一处,并赋以名称,于是便有了某某字符集。 例如: ASCII: ASCII字符集:包含大小写英文、阿拉伯数字、标点,以及一些不可见的控制符共1

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入

  1. 字符集与编码常识

  字符集:

  人们根据需要把某些字符收集到一处,并赋以名称,于是便有了某某字符集。

  例如:

  ASCII:

  ASCII字符集:包含大小写英文、阿拉伯数字、标点,以及一些不可见的控制符共128个。

  ASCII编码:使用7位表示一个字符。编码范围是[0-127](即Hex[00-7F]),其中[0-31](Hex[00-1F])部分以及127(Hex7F)是控制符,其余的都是些可见字符。

  GB2312:

  GB2312字符集:ASCII字符集+7000左右汉字字符。

  GB2312编码:兼容ASCII编码。对字节进行判断,如值127,则它需要跟其后的另一个字节合并表示一个字符。其理论汉字编码空间为128X256,超过3万个字符。

  GBK:

  GBK字符集:GB2312字符集+20000左右汉字字符。

  GBK编码:兼容GB2312编码。利用了GB2312编码闲置的编码空间。

  GB18030:

  GB18030字符集:GBK字符集+若干汉字+若干少数民族字符,为目前国内最新的字符集。

  GB18030编码:兼容GBK编码。继续利用GBK编码闲置的编码空间,对于超出编码空间的则采用4个字节表示。

  BIG5:

  BIG5字符集:ASCII字符集+13000左右汉字(繁体)。

  BIG编码:兼容ASCII编码。其编码模式类似于GB2312.

  UNICODE:(UNICODE一词在日常使用中显得宽泛、混乱,在不同的语境中可以是以下意思之一。)

  UNICODE标准:由一些组织提出的一套标准,对人类文字的显示、编码等进行了一系列的规定。

  UNICODE字符集:目前最新版的UNICODE字符集中已经包含各种语言的超过10万的字符。

  UNICODE编码:(狭义的UNICODE编码可能指UCS-2,也可能指UTF-16;广义的UNICODE编码可以指包括以下四种在内的若干种对UNICODE标准的编码实现。)

  1. UTF-32编码:固定使用4个字节来表示一个字符,存在空间利用效率的问题。

  2. UTF-16编码:对相对常用的60000余个字符使用两个字节进行编码,其余的(即'补充字符supplementary characters')使用4字节。

  3. UCS-2编码:是对UNICODE早期版本的实现,它与UTF-16的唯一区别是它不包括'补充字符',所以它对字符的编码只使用两个字节。目前此编码模式已过时。

  4. UTF-8编码:兼容ASCII编码;拉丁文、希腊文等使用两个字节;包括汉字在内的其它常用字符使用三个字节;剩下的极少使用的字符使用四个字节。

  ISO8859-1:(使用Oracle的同志们可能见过这个WE8ISO89859P1,没错,就是它。)

  ISO8859-1字符集:ASCII字符集+若干西欧字符,例如字母?、?.

  ISO8859-1编码:使用8位表示一个字符,同时移除了原ASCII编码中的控制符(即[0-31],及127)。

  Code page:(可以把"code page"认为是"编码"的近义词。至于为什么有这个名称?历史遗留问题。)

  ANSI code pages:你一定见过ANSI,想想另存文本文件时。ANSI code pages实际上是一系列的编码集合,根据操作系统区域设置而激活其中一种作为默认ANSI编码。例如公司电脑(英文系统)上的ANSI code page可能是1252,而家里的中文系统则可能是936.所以在家里可以用ANSI存储一个包含中文的文本文件,在公司则不行。可以在注册表键:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NLS\CodePage\ACP中查看到当前使用的ANSI code page. C#可以通过Encoding.Default查看。

  OEM code pages: OEM code pages是给控制台应用程序(如SQLPLUS)使用的。除CJK环境(Chinese-Japanese-Korean)外,Windows使用不同的ANSI code page和OEM code page.例如,公司英文系统上使用的是437.可以使用CHCP命令查看当前使用的OEM code page, C#可以通过Console.OutputEncoding查看。

  Code page 1252:

  cp1252字符集:ASCII字符集+若干西欧字符+若干特殊符号,比如?、‰。

  cp1252编码:使用8位表示一个字符。编码范围是[0-255](即Hex[00-FF]),[0-127]部分与ASCII相同,新增的大部分是西欧的字符,例如一些带上标的字母?、?,以及像这样一类特殊符号)

  PS1:现实中两台PC上的code page信息

  PC1:英文版Windows XP,ANSI code page=1252, OEMcode page=437

  PC2:中文版Windows 7,ANSI codepage=936, OEM code page=936

  PS2:cp1252与cp437编码表下载请猛击这里,早期控制台应用程序常常需要画一些粗糙的表格等等图形,所以可以在437中看到不少不同的横线竖线这一类的特殊符号。

  PS3:CP1252、ISO8859-1、ASCII比较,就实际使用的编码范围来说:CP1252>ISO8859-1>ASCII.ASCII是[0-127],CP1252是[0-255],ISO8859-1则移除了cp1252中[0-31]及127这些不可见的控制符,同进移除了[128-159](即Hex[80-9F])中的特殊符号。

  2. 字符集 2.1. 编码schema

  § 单字节字符集:

  7bit: ASCII 7-bit American(US7ASCII)

  8bit: ISO8859-1 West European(WE8ISO8859P1)、EBCDICCode Page 500 8-bit West European(WE8EBCDIC500)、DEC 8-bit WestEruopean(WE8DEC)

  § 变长多字节字符集:例如Japanese Extended UNIX Code(JEUC)、ChineseGB2312-80(GB2312-80)、AL32UTF8(UTF-8)

  § 定长多字节字符集:只有National Character Set(AL16UTF16)是定长多字节字符集,是2个字节的Unicode编码

  § Unicode(AL32UTF8,AL16UTF16,UTF8):Oracle使用AL32UTF8、UTF8、UTFE作为数据库字符集,使用AL16UTF16和UTF8作为国家语言字符集。

  2.2. 数据库字符集与国家字符集比较

  为什么要有两个字符集?如果我知道只需要英文,设置数据库字符集=US7ASCII,如果我知道只需要西欧字符,设置数据库字符集=WE8MSWIN1252或者WE8ISO89859P1,或者干脆就用AL32UTF8.你看,我只需要设定"数据库字符集",那么"国家字符集"有什么必要呢?

  其实,考虑到历史遗留问题以及数据库创建者们无法避免的"短视",很多现有数据库都无法支持UNICODE字符集,例如要在现有的US7ASCII数据库字符集的数据库中存储中文,这个时候"国家字符集"+NVARCHAR2这样的组合就能救你一命了。对于数据类型为NVARCHAR2(以及NCHAR, NCLOB)的字段,它使用是国家字符集,与数据库字符集的设置无关。自9i以后,国家字符集可选的只有AL16UTF16与AL32UTF8,UTF-16与UTF-8都是UNICODE编码标准的实现,因些可以表示世界上几乎所有的文字。

  当然,如果数据库字符集本身就使了UNICODE字符集,就没有必要使用NVARCHAR2, NCHAR, NCLOB这些类型了。

  数据库字符集与国家字符集比较:

  数据库字符集

  国家字符集

  在创建时定义

  在创建时定义

  不重建不能再改变

  除了一些例外,不重建不能再改变

  用char、varchar2、clob、long存放数据列

  用NCHAR、NVARCHAR2、NCLOB存放数据列

  可以存放变长字符集

  可以使用AL16UTF16或者UTF8存放Unicode

  Oracle对字符集的命名实际上有一定的规则可寻,例如:

  AL32UTF8

  【AL】支持所有语言(All Language)。

  【32】每字符最多占用32位(4字节)。

  【UTF8】编码为UTF-8.

  WE8MSWIN1252

  【WE】支持西欧语言(Western Europe)。

  【8】每字符需要占用8位(单字节)。

  【MSWIN1252】编码为CP1252.

  US7ASCII

  【US】表示美国(United States)。

[1] [2] [3]

Oracle全球化支持:字符集系统介绍及服务器端、客户端设置