- 最后登录
- 2023-8-16
- 在线时间
- 1686 小时
- 威望
- 2135
- 金钱
- 50532
- 注册时间
- 2011-10-12
- 阅读权限
- 200
- 帖子
- 5207
- 精华
- 39
- 积分
- 2135
- UID
- 2
|
3#
发表于 2013-9-13 21:06:47
什么是字符集
处理字符时,计算机系统使用的是数字代码,而不是以图形方式表示的字符。编码字符集
将数字代码映射到计算机或终端可以显示和接收的字符。目前,Oracle DB 大约支持30 种
编码字符集,但支持的语言和地区则多得多(约100 种)。这也许是因为,Unicode 是一
种通用字符集,囊括现代绝大多数的主要脚本。
不同的字符集支持不同的字符指令表。由于字符集通常基于特定的编写脚本,因此,它们
可以支持多种语言。但是,基于脚本的字符集局限于基于类似脚本的几组语言,从这个意
义上而言,这些字符集是有限的。通用字符集囊括现代绝大多数主要脚本,为多语言支持
提供了更为有用的解决方案。有关Unicode 标准的信息,请参阅相关的Web 站点,网址
是http:www.unicode.org。
Oracle DB 提供了多种编码方案:
• 单字节
• 宽度不同的多字节
• 通用
什么是字符集(续)
单字节字符集
在单字节字符集中,每个字符占用一个字节。单字节7 位编码方案最多可以定义
128 (27) 个字符;单字节8 位编码方案最多可以定义256 (28) 个字符。
单字节方案示例
7 位字符集:
• 7 位美国信息交换标准代码(ASCII) (US7ASCII)
8 位字符集:
• 西欧国际标准组织(ISO) 8859-1 (WE8ISO8859P1)
• 8 位西欧DEC (WE8DEC)
• 8 位意大利扩展的二进制编码十进制交换码(EBCDIC) 码页(I8EBCDIC1144)
注:只有基于ASCII 的平台才支持基于ASCII 的字符集。同样,只能在基于
EBCDIC 的平台上使用基于EBCDIC 的字符集。
多字节字符集
宽度不同的多字节字符集中,每个字符用一个或多个字节表示。多字节字符集通常用来支
持亚洲语言。一些多字节编码方案使用最高有效位值来指示一个字节的含义:是表示单个
字节,还是属于表示一个字符的一系列字节的一部分。但是,其它字符编码方案区分单字
节字符与多字节字符。由设备发送的移出控制码指示,遇到移入代码之前,任何连续的字
节都是双字节字符。与转换相关的编码方案主要用在IBM 平台上。
宽度不同的多字节方案示例
• 16 位日本Shift-JIS (JA16SJIS)
• 使用香港增补字符集HKSCS-2001 的MS Windows 码页950 (ZHT16HKSCS)
• Unicode 4.0 UTF-8 通用字符集(AL32UTF8)
了解Unicode
Unicode 是一种通用编码字符集,支持使用单个字符集存储任何一种语言的信息。无论
使用何种平台、程序或语言,Unicode 都能为每个字符提供唯一的代码值。
Unicode 标准已为许多软件和硬件供应商采用。现在,很多操作系统和浏览器都支持
Unicode。Unicode 是XML、Java、JavaScript、LDAP 和WML 等标准所需的字符集。
它还与ISO/IEC 10646 标准保持同步。
AL32UTF8 编码
AL32UTF8 编码是Unicode 的8 位编码。它是一种宽度可变的编码,也是ASCII 的严格
超集。严格超集意味着7 位ASCII 中的每个字符在AL32UTF8 中都可用且具有相同的对
应代码点值。
在这种编码中,一个Unicode 字符可以是1、2、3 或4 个字节。欧洲脚本中的字符用1 或
2 个字节表示;大多数亚洲脚本中的字符用3 个字节表示,而增补字符则用4 个字节表示。
XP 使用的主要Unicode 编码。
增补字符
Unicode 的初始版本使用了2 个字节的编码格式。通过对每个代码点使用16 位编码,总
共可以表示65,536 个字符。但是,现实要求支持更多的字符。例如,单讲汉语的团体使
用的字符就超过了55,000 个。
对于汉语、日语和韩语这类语言,仍有成千上万个表意文字尚未进行编码。即使其中许多
表意文字是很少使用的字符,它们仍会出现在必须以电子方式保留的文档中。
为了满足这一需求,Unicode 标准定义了增补字符。通过采用两个16 位的代码点(也称
为代理对)来表示单个字符,可以多定义1,048,576 个字符。
在这些字符中,第一批增补字符有44,944 个,新增到了2001 年3 月发布的Unicode 标准
3.1 中。加上Unicode 3.0 中已有的49,194 个字符,Unicode 3.1 现在总共包含94,140 个编
码字符。这便增加了Unicode 标准的复杂性,但大大减少了对大量不同编码的管理工作。
Oracle Database 10g 支持Unicode 4.0 标准。
注:关于上述内容,请注意,带有连字符的UTF-16 和UTF-8 指的是Unicode 标准编码,
而不带连字符的UTF8、AL32UTF8 和AL16UTF16 指的是基于Unicode 标准的Oracle 数
据库字符集。
注:有关Oracle 对Unicode 的支持的详细信息,请参阅《Oracle 数据库全球化支持指南
10g 发行版2 (10.2)
如何使用字符集
NLS_LANG 参数定义客户机终端的字符编码方案。不同的客户机可以使用不同的编码方案。
客户机与服务器之间传递的数据可以在两种编码方案之间自动转换。数据库的编码方案应
该是所有客户机编码方案的超集,或者与所有客户机编码方案等同。对于客户机应用程序,
转换是透明的。
数据库字符集与客户机字符集相同时,数据库会假定正在发送或接收的数据属于同一字符
集,因此不会执行验证或转换。
如果客户机应用程序所在的平台与服务器的不同,且该平台使用不同的字符编码方案,则
在客户机/服务器环境中可能需要转换字符集。对于在客户机与服务器之间传递的这种字
符数据,必须在两种编码方案之间进行转换。通过Oracle Net,可以自动进行透明的字符
转换。
要避免的问题
如果客户机上的NLS_LANG 参数未正确设置,则通常会在数据库中输入无效数据。
NLS_LANG 值应该反映传入数据的编码。
• NLS_LANG 参数的设置正确时,数据库可以自动转换从客户机操作系统传入的数据。
• NLS_LANG 参数的设置错误时,将不会正确转换输入数据库的数据。
例如,假定数据库字符集是AL32UTF8,客户机为英文版的Windows 操作系统(码页为
WE8MSWIN1252),客户机上的NLS_LANG 设置为AL32UTF8。输入数据库的数据是用
WE8MSWIN1252 编码,却没有转换为AL32UTF8 数据,因为客户机上的NLS_LANG 设
置与数据库字符集相符。所以,Oracle DB 认为无需进行转换,从而将无效的数据输入到
数据库中。
其它问题示例
例如,数据库字符集是US7ASCII,客户机终端使用的是简体中文版Windows。通过将
NLS_LANG 设置为SIMPLIFIED CHINESE_HONGKONG.US7ASCII,作为客户机字符集,
可以在单字节数据库中存储多字节简体中文字符。这就表示,数据库会将这些字符视为单
字节的US7ASCII 字符,因此,所有SQL 字符串操纵函数(如SUBSTR 或LENGTH)都
基于字节,而不是字符。将数据从该数据库导出并导入其它数据库之后,可能会丢失所有
非ASCII 字符。
选择字符集
为了获得最佳性能,选择的字符集不但要避免字符集的转换,而且要使用对所需的语言而
言最高效的编码。与多字节字符集相比,单字节字符集产生的性能更佳。此外,单字节字
符集占用的空间最少。但是,单字符字符集限制了所能支持的语言数量。
为了选择正确的数据库字符集,请评估当前和未来的业务需求,以及技术要求(例如,
XML 和Java 标准要求使用Unicode)。总而言之,Oracle 建议您对所有新数据库使用
Unicode,因为Unicode 是最灵活的字符集,可以避免以后转换。
要指定相应的字符集,请结合使用CREATE DATABASE 语句以及CHARACTER SET 和
NATIONAL CHARACTER SET 子句。如果不使用NATIONAL CHARACTER SET 子句,
字符集将默认为AL16UTF16。
创建数据库之后,可能需要更改字符集,以便满足不可预见的要求,例如,为新的数据源
(XA 和数据仓库等)提供支持。通常,这是一项费时费财的工作。在大多数情况下,需
要进行完全导出/导入,才能将所有的数据正确转换成新的字符集。
数据库字符集和国家字符集
由于数据库字符集用来标识和保留SQL 和PL/SQL 源代码,所以该字符集必须包含
EBCDIC 或7 位ASCII(二者中取平台本地码)。因此,不能使用宽度固定的多字节字符
集作为数据库字符集,只能使用该字符集作为国家字符集。
国家字符集是一种备用字符集,使您可以在没有Unicode 数据库字符集的数据库中存储
Unicode 字符数据。SQL NCHAR、NVARCHAR2 和NCLOB 数据类型都只支持Unicode 数据。
可以使用UTF8 或AL16UTF16 字符集。
获取字符集信息
使用NLS_DATABASE_PARAMETERS 视图显示数据库的永久性NLS 设置,包括数据库
字符集和国家字符集。此视图包含显式设置的值以及数据库使用的默认值。
指定基于语言的行为
除了在数据库中存储和检索大多数现代语言数据之外,还可以为这些语言的子集提供支持。
数据库可以使用本地的日期和时间格式显示日期,还可以根据文化习俗对文本数据进行排
序。此外,数据库还支持地理位置或地区特有的文化习俗,如数字和货币惯例。
NLS 参数确定客户机和服务器上特定于区域设置的行为。指定国家语言支持(NLS) 参数
的方法有四种:
• 作为服务器端的初始化参数,指定默认的服务器环境。(这些默认设置不会影响客
户端。)
• 作为客户机的环境变量,指定区域设置相关行为,覆盖为服务器设置的默认值
• 使用ALTER SESSION 命令覆盖为客户机和服务器设置的默认值
• 在SQL 函数中,为应用程序或查询显式地硬编码NLS 特征,取代为服务器和客户机
设置的默认值以及使用ALTER SESSION 语句指定的所有值语句指定的所有值
为会话指定基于语言的行为
环境变量NLS_LANG
区域设置是运行系统或程序时所用的语言和文化环境。设置NLS_LANG 环境参数是为
Oracle 数据库软件指定区域设置行为的最简单方法。这种方法设置客户机应用程序和数据
库服务器使用的语言和地区。它还为客户机程序输入或显示的数据设置字符集。
NLS_LANG 的值将覆盖NLS 初始化参数的所有值。
每个组件都可控制NLS 功能的子集:
NLS_LANG=<language>_<territory>.<charset>
language 用来覆盖NLS_LANGUAGE 的值。territory 用来覆盖NLS_TERRITORY 的
值。charset 指定客户机应用程序(通常是用户终端应用程序)使用的字符编码方案。
NLS_LANG 定义的所有组件都是可选的;任何未指定的项都使用其默认值。如果指定地区
或字符集,则前面必须有分隔符[地区用下划线(_),字符集用句点(.)]。例如:
NLS_LANG = _JAPAN
NLS_LANG = .US7ASCII |
|