Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

0

积分

1

好友

1

主题
1#
发表于 2013-9-13 15:32:30 | 查看: 4875| 回复: 3
本帖最后由 echo 于 2013-9-13 15:32 编辑

oracle版本:11gR2
系统使用范围:国内
疑问:oracle字符集ZHS16GBK与AL32UTF8选择使用那个存在疑问?
描述:
ZHS16GBK:亚洲16bit简体中文、2字节、定长,更节约空间
AL32UTF8:国际通用、3字节、不定长,包含所有语言
上述2者超子集关系,到底选用那个更有利于oracle日常使用?
2#
发表于 2013-9-13 16:32:57
跨国公司=》 一律 AL32UTF8

国内中小企业,不设外事=》 考虑ZHS16GBK

回复 只看该作者 道具 举报

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

回复 只看该作者 道具 举报

4#
发表于 2013-9-13 21:08:54
基于语言和基于地区的参数
设置NLS_LANGUAGE 和NLS_TERRITORY 初始化参数可以确定Oracle 数据库应该使用
的默认值。对于默认值取决于NLS_LANGUAGE 和NLS_TERRITORY 设置的那些初始化
参数,通过明确设置它们的值,可以覆盖这些默认值。
NLS_LANGUAGE 初始化参数
NLS_LANGUAGE 初始化参数确定下列参数的默认值:


NLS_DATE_LANGUAGE  确定其它日期格式元素的月日名称、缩写和拼写
值所用的语言

NLS_SORT  更改Oracle 数据库用于对字符值排序的语言排序
序列。(排序值必须是语言排序序列的名称。)


基于语言和基于地区的参数(续)
NLS_TERRITORY 初始化参数
NLS_TERRITORY 确定下列初始化参数的默认值:
以下是一些与NLS_LANGUAGE 和NLS_TERRITORY 值无关的NLS 初始化参数:
NLS_DUAL_CURRENCY 定义给定地区的辅助货币符号
为与TO_CHAR 和TO_TIMESTAMP_TZ 函
数结合使用的TIMESTAMP 和TIMESTAMP
WITH LOCAL TIME ZONE 数据类型定义
默认的日期格式。必须设置NLS_LANG。
NLS_TIMESTAMP_TZ_FORMAT
为TIMESTAMP 和TIMESTAMP WITH
LOCAL TIME ZONE 数据类型定义默认的
日期格式。必须设置NLS_LANG。
NLS_TIMESTAMP_FORMAT
指定日期格式。(该值必须是日期格式
样式。)
NLS_DATE_FORMAT
NLS_ISO_CURRENCY 指示应该使用其 ISO 货币符号的地区
NLS_NUMERIC_CHARACTERS 显式指定新的小数点字符和组分隔符
NLS_CURRENCY 指定本地货币符号
列 说明
允许使用字节或字符长度语义创建CHAR、
VARCHAR2 和LONG 列。
NLS_LENGTH_SEMANTICS
可以设置为ANSI 或BINARY。将NLS_COMP
设置为ANSI 时,SQL 操作将根据NLS_SORT
的值进行语言比较。
NLS_COMP
NLS_CALENDAR 指定 Oracle DB 使用的日历体系
列 说明


指定基于语言的行为
除了明确发出ALTER SESSION 命令之外,还可以使用DBMS_SESSION.SET_NLS 数据
库过程,指定要更改的参数名称及该参数的新值。幻灯片中显示的第二个示例执行的操作
与第一个示例相同,只不过使用的是DBMS_SESSION 程序包。
iSQL*Plus、SQL*Plus 或SQL*Loader 之类的客户机实用程序会读取客户机上设置的环境
变量,并在它们连接到数据库之后发出相应的ALTER SESSION 命令。
第三个示例说明了NLS_DATE_LANGUAGE NLS 参数在TO_CHAR SQL 函数中的用法。

语言搜索和排序
不同的语言使用不同的排序顺序。此外,使用相同字母表的不同文化或国家(地区),
单词的排序顺序也可能不同。例如,在丹麦,Æ 排在Z 之后,而Y 是Ü 的异体字。排序
可以:
• 区分大小写,也可以不区分大小写
• 忽略或考虑变音符号(字符或字符组合旁边或中间的标记,用于指示与没有变音
符号的字符音相异的音)
• 基于音标,也可以基于字符的外观(如东亚象形文字中的笔画数)
另外一个常见的排序问题是,将字母组合为单个字符。例如,在传统的西班牙语中,ch
是位于c 之后的独特字符,其正确顺序是:cerveza、colorado 和cheremoya。这意味着,
在数据库检查到下一个字符是否为h 之前,不能对字母c 进行排序。
为了生成与字符的字母顺序匹配的排序序列,必须使用另外一种排序方法:在字符编码方
案中独立于其数值对字符进行排序。这种方法称为语言排序。执行语言排序时,使用反映
每个字符的正确语言顺序的数值替换字符。



语言搜索和排序(续)
二进制排序是一种常规排序机制,它根据字符编码所用的二进制值对字母进行排序。二进
制排序是速度最快的排序方法。由于ASCII 和EBCDIC 标准以递增数值定义字母A 到Z,
二进制排序可以为英文字母表生成合理的结果。当存在其它语言中使用的字符时,二进制
排序通常不会生成合理的结果。
对于单语排序,Oracle DB 使用主要值和次要值对字符进行比较。通常,外观相同的字母
具有相同的主要值。例如,A、a 和ä。在Oracle 数据库中,将变音符号和大小写不同的
字母定义为有相同的主要值,但是次要值不同。
对于单语排序,Oracle DB 在比较单语排序中的字符串时会进行两遍比较。第一遍是比较
主要表中整个字符串的主要值,第二遍是比较次要表中的次要值。虽然这种排序方法较二
进制排序略胜一筹,但仍受到限制。
使用多语排序,可以在一次排序过程中对多种语言的数据进行排序。对于排序规则复杂的
地区或语言,这是很有用的。
有关支持的语言排序的详细信息,请参阅《Oracle 数据库全球化支持指南》。




使用语言搜索和排序
为了克服二进制排序的限制,可以通过设置NLS_SORT 参数或在查询中使用NLSSORT 来
指定语言排序。
NLS_SORT 参数
以使用WE8ISO8859P1 字符集为例,思考一下数据库中存储的下列单词:
• gelée
• gelé
• gèle
• gelez
如果将NLS_SORT 设置为BINARY,则gelez 会排在gelé 之前。这是因为在
WE8ISO8859P1 字符编码中,e 的二进制值小于è 的二进制值。
如果将NLS_SORT 设置为FRENCH 单语排序,则单词gelé 会排在gelez 和gèle 之前,
但这仍不能满足法语中所有细微差异的要求。例如,在法语中,字母按照从左到右的顺序
排列,而重音按照从右到左的顺序排列。
将NLS_SORT 设置为FRENCH_M 多语排序时,可以对字符和变音符号正确排序。


使用语言搜索和排序(续)
NLSSORT 函数
NLSSORT 允许在查询级别定义排序。下面的示例在会话级别将NLS_SORT 设置为
BINARY,但是在查询级别更改了这一排序。
SQL> ALTER SESSION SET NLS_SORT=BINARY;
Session altered.
SQL> SELECT fr_word
2 FROM words
3 ORDER BY fr_word;
FR_WORD
-------
gelez
gelé
gelée
gèle
SQL> SELECT fr_word
2 FROM words
3 ORDER BY NLSSORT(fr_word,'NLS_SORT=FRENCH_M');
FR_WORD
--------
gèle
gelé
gelée
gelez


不区分大小写和重音的搜索和排序
使用会话参数NLS_SORT 指定语言排序名称。默认值从初始化参数NLS_LANGUAGE 派生。
_AI 和_CI 值是排序名称的后缀,指示排序是不区分重音还是不区分大小写。从本幻灯
片中的示例,我们可以确定下列内容:
• “French_M”排序不区分重音,也不区分大小写
• “Xgerman”排序区分重音但不区分大小写
除非使用NLSSORT 函数,否则在WHERE 子句和PL/SQL 块中进行的比较运算是二进制的。
通过将NLS_COMP 设置为ANSI,指示在WHERE 子句和PL/SQL 块中执行比较运算时,
应该使用NLS_SORT 参数中指定的语言排序。此外,还必须对需要语言排序的列定义
索引。
注:NLS_SORT 参数的格式对单语和多语语言排序均适用。在单语排序中,只包含主要和
次要级别。如果将NLS_COMP 参数设置为ANSI,则对于已支持早期数据库版本中基于排
序规则的比较的所有SQL 或PL/SQL 运算符,将应用这些选项。_AI 或_CI 选项在
INSTR、TRIM 和LIKE SQL 函数中不会受到影响,因为这些函数只以二进制顺序对字符
串进行比较。
数据库移植人员请注意:Sybase、SQL Server 和MS Access 可以使用不区分大小写的运算。
这些选项可以用来保留现有的应用程序功能。

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2025-1-4 07:21 , Processed in 0.047110 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569