1、选择ORACLE数据库字符集如何选择数据库的字符集是一个有争议的话题,字符集本身涉及的范围很广,它与应用程序、客户的本地环境、操作系统、服务器等关系很密切,因此要做出合适的 选择,需要明白这些因素之间的关系。另外对字符集的基本概念,ORACLE数据库字符集的一些知识也需要了解。 随着国内的软件产品逐步走向海外,对于多语言的支持已经成为软件的一个基本要求,采用UNICODE标准也逐渐成为通用的设计方案,此时ORACLE数据 库的字符集应该如何选择?很多人都有自己的见解,在网上也可以看到很多关于字符集的文章。这些文章有很多精华值得去学习,但是另一方面还存在一些错误,尤 其对UNICODE,存在一些概念不清的地方。 数据库字符集的选择并不存在绝对意义上的正确或错误,每种字符集都有它适用的环境。对于我们来说,了解得越多,越能帮助自己做出适当地选择,而且可以采取 措施去主动防范或规避可能出现的问题。反之,如果数据库字符集选择不恰当,会给后面的工作带来很多的麻烦,需要花费很多时间和精力去解决问题,有些问题甚 至会影响到客户的业务使用。本文希望可以给大家提供一些相对全面的知识,方便大家了解数据库字符
2、集的相关概念,因此有些繁琐,请大家见谅。另外由于个人的 局限,有何不妥之处还请大家不吝指正。下面我们由浅入深,先由概念入手,再给出几种常用的字符集设置建议,对一些可能遇到的问题做出分析,最后给出自己的建议。 1、字符集的一些基本知识 讲到数据库的字符集设置,首先需要对字符集的知识有些了解。以下是字符集的基本知识介绍:由于计算机只能存储使用二进制数据,因此对于一些字符或符号,需要对它们进行编码,用编码后的数值来表示这些字符。对于一组符号的编码集合就是字符集。 字符集有很多种,最初的字符集是ASCII,它用一个字节中的7位来表示128个字符,第8位没有使用。它包括大小写字母、数字0-9、标点符号、非打印 字符(换行符、制表符等4个)以及控制字符(退格、响铃等)等。由于ASCII支持的字符很有限,因此随后又出现了很多的编码方案,这些编码方案大部分都 是包括了ASCII的,它们只是做了扩展,这些扩展的内容一般各不相同,因此说ASCII是一个比较基本的编码,EBCDIC编码是另一个比较基本的编 码,它的部分字符采用了和ASCII不同的编码值,因此两者是不兼容的基本编码方案。采用EBCDIC编码的
3、比较少,目前主要是IBM 的系统采用,如AS400及S390系统,大部分的系统都是基于ASCII编码的。 由于亚洲国家的字符集相对复杂一些,因此一般都使用了两个及以上的字节进行编码的方案。对于简体中文,GB2312码是国家1981年实施的编码标准,通 行于大陆。新加坡等地也使用此编码。GBK编码是GB2312码的扩展,是1995年发布的指导性规范,它在字汇一级支持 ISO/IEC 10646-1 和GB 13000-1 的全部中日韩 (CJK) 汉字(20902字)。目前最新的汉字字符集是2000年的GB18030,它是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还 收录了藏文、蒙文、维吾尔文等主要的少数民族文字。目前简体WINDOWS的缺省内码还是GBK,可以通过GB18030升级包升级到GB18030。不 过GB18030相对GBK增加的字符,普通人是很难用到的,因此GBK还是我们目前最常用的简体中文字符集。 由于编码方案太多且彼此之间不兼容,存在互相之间存在冲突的情况,即对于同一个编码数值,在两种不同的编码方案中代表的是两个不同的字符。这样对于一些 WEB应
4、用来说,由于多种语言文字的同时使用及存储,需要采用一种统一的字符集。为此,国际标准化组织(ISO)制定了ISO 10646码表,而Unicode协会制定了Unicode规范,这两个体系刚开始时是独立建立的,在1991年,双方都认识到世界不需要两个不兼容的字 符集。于是它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。从Unicode2.0开始,Unicode项目采用了与ISO 10646-1相同的字库和字码。目前两个项目仍都存在,并独立地公布各自的标准。Unicode协会现在的最新版本是2006年的Unicode 5.0。ISO的最新标准是10646-3:2003。下面简单介绍一下几种常见的编码方式: UCS(Universal Character Set)是按ISO-10646定义的字符集,有两种最常用编码方式: UCS-2和UCS-4。 UCS-2:使用0-65535之间的数表示一个unicode字符。UCS-2无法表示所有的unicode字符,只能表示其前65536个字符(称为 Basic Multilingual Plane,BMP)。我们一般经常使用的UNICOD
5、E码就是指这个编码方案。 UCS-4:使用0-FFFFFFFF之间的数表示一个unicode字符,但为了和unicode体系兼容(unicode体系是一个20bit系 统),ISO-10646表示所有定义的字符将不超过10FFFF。UCS-4可以表示所有的unicode字符。Unix 下使用 UCS-2/UCS-4会导致非常严重的问题,因为有一些特殊的字符, 比如 0 或 /, 它们在文件名和其他C的库函数参数里都有特别的含义,C语言使用0作为字符串结尾,而Unicode里恰恰有很多字符都有一个字节为0,这样一 来,C语言的字符串函数将无法正常处理Unicode,除非把世界上所有用C写的程序以及他们所用的函数库全部换掉 。 为了解决这个问题,于是产生了将Unicode编码规则和计算机的实际编码对应起来的一个规则,UTF,英文为UCS Transformation Format,即UCS转换格式,目前常用的有UTF-8、UTF-16、UTF-32三种。(还有UTF-7在此就不介绍了)。正如名字所示,它们分别 使用8位、16位、32位比特对UCS进行编码。 UTF-8:一种变长的Unico
6、de编码方式,使用1到4个字节表示一个字符。这种方式的最大好处,是UTF8保留了ASCII字符的编码作为它的一 部分,因此在ASCII表示的128个字符在UTF-8的编码没有变化,它的兼容性比较好。UTF-8在目前WEB应用上使用很广泛。 UTF-16:一种变长Unicode编码方式,使用两个或者四个字节表示一个字符。这种编码方式比较节省空间,因为它把最常使用的字符都用两个字节来表示,而那些不常用的字节则用两个或四个字节来表示。但对于英文字符来说,它要用两个字节来编码。 UTF-32:一种固定长度的Unicode编码方式,使用四个字节表示一个字符,它适用在内存很充足,需要定长的编码场合。 2、ORACLE数据库的字符集 ORACLE的字符集名字一般由以下部分组成:语言或区域、表示一个字符的比特位数、标准字符集名称(可选项,S或C,表示服务器或客户端)。ORACLE字符集UTF8与UTFE不符合此规定,其它基本都是这种格式。 对于US7ASCII,表示区域是US,用7个比特位表示一个字符,标准的字符集名称为ASCII。 对于中文字符集ZHS16GBK,表示简体中文(ZHT为繁体中文),一
7、个字符需要16位比特,标准的字符集名称为GBK。而 ZHS16CGB231280表示简体中文,一个字符需要16位比特,标准的字符集名称为GB231280,属于我们前面提过的1981年发布的 GB231280标准。虽然我们说,GBK编码标准是GB2312编码标准的扩展,但是数据库字符集ZHS16GBK与ZHS16CGB231280之 间却不是严格的超集与子集的关系,主要是有些汉字的编码在两个字符集中的数值是不同的,因此它们进行字符集转换时会出现问题。 在本文中,有时候使用的是标准字符集名称,有时候又需要使用ORACLE字符集的名称,因此希望大家明白两者之间的对应关系。 ORACLE数据库有国家字符集(national character set)与数据库字符集(database character set)之分。两者都是在创建数据库时需要设置的。国家字符集主要是用于NCHAR、NVARCHAR、NCLOB类型的字段数据,而数据库字符集使用很 广泛,它用于:CHAR、VARCHAR、CLOB、LONG类型的字段数据;表名、列名、PL/SQL中的变量名;输入及保存在数据库的SQL和PL /S
8、QL的源码。 ORACLE支持的Unicode字符集有以下几种,下面的列表给出了字符集的名称、对应的数据库版本范围、采用的Unicode的版本。 字符集 对应的数据库版本范围 Unicode的版本 字符集 对应的数据库版本范围 Unicode的版本 AL24UTFFSS 7.2-8.1 1.1 UTF8 8.0-10g 2.1 (8.0-8.1.6) 3.0 (8.1.7-10g) UTFE 8.0-10g 2.1 (8.0-8.1.6) 3.0 (8.1.7-10g) AL32UTF8 9.0-10g 3.0 (9.0) 3.1 (9.2) 3.2 (10.1) 4.01(10.2) AL16UTF16 9.0-10g 3.0 (9.0) 3.1 (9.2) 3.2 (10.1) 4.01(10.2) AL24UTFFSS:是ORACLE第一种支持Unicode的字符集,从7.2版本开始使用,但是它支持的Unicode版本为1.1,因此从9i开始就不支持此字符集了。 UTF8:是ORACLE从ORACLE8开始使用的属于UTF-8编码的字符集,从ORACLE8.0到ORACLE8.1
9、6,Unicode版本为2.1,而ORACLE817到10g,采用的Unicode标准为3.0 UTFE:用于EBCDIC码平台上的数据库Unicode字符集。因此它属于专用系统使用的字符集,其它属性与UTF8基本相同。 AL32UTF8:是从ORACLE9开始使用的属于UTF-8编码的字符集,与UTF8相比,它采用的Unicode版本更新,在10g版本中使用的是 Unicode 4.01标准,而UTF8因为兼容性的考虑,在10g版本中用的是Unicode 3.0标准。 AL16UTF16:是ORACLE第一种采用UTF-16编码方式的字符集,从ORACLE9开始使用,是作为缺省的国家字符集使用,它不能被用作数据 库的字符集。这是因为数据库的字符集决定了SQL与PL/SQL源码的编码方式,对于UTF16这种使用固定的两个字节来表示英文字母的编码方案来说, 确实不适于用作数据库的字符集,ORACLE目前采用的数据库字符集都是基于ASCII或EBCDID作为子集的编码方案。 从以上几种字符集的介绍来看,Unicode字符集一般使用UTF8和AL32UTF8。如果数据库版本都在9i及其以上,不需要考虑ORACLE8的数 据库,建议使用AL32UTF8字符集,它采用的Unicode标准要比UTF8采用的Unicode标准更新,支持的字符也更多一些。如果要考虑 ORACLE8数据库,建议使用UTF8字符集,它的兼容性好,在ORACLE8及8I数据库上使用AL32UTF8字符集容易出现问题。 3、如何选择合适的数据库字符集 前面我们介绍了字符集的一些概念,并对ORACLE数据库的常用几个字符集有了一些了解,下面就具体对数据库字符集的选择阐述一些个人的观点: 3.1、数据库需要存储的数据类型是字符集选择的首要考虑目标。 由于数据库的主要功能在于存储数据,因此要保
《怎样选择数据库的字符集》由会员luobi****88888分享,可在线阅读,更多相关《怎样选择数据库的字符集》请在金锄头文库上搜索。