1. Oracle 字符集定义
Oracle 字符集:按照特定的字符编码方案,对一组特定的字符,符号,分别赋予不同数值编码的集合。
Oracle的字符集命名遵循以下命名规则:
<Language><bit size><encoding>
即: <语言><比特位数><编码>
例如:
1. US7ASCII 其中US代表America 地区,7位,ASCII字符编码。它是 Oracle数据库最早支持的编码方案
2. ZHS16GBK 表示采用GBK编码格式、16位(两个字节)简体中文字符。2个字节存放一个汉字。
3. zhs16cgb231280 表示采用cgb231280编码格式、16位(两个字节)简体中文字符。2个字节存放一个汉字。
4. AL32UTF8 其中AL代表ALL,指适用于所有语言。32位,3个字节存放一个亚洲语言字符。UTF-8,8位Unicode编码方式。
5. AF16UTF16 其中AF代表ALL Fix, 适用于所有语言。16位,所有的字符以2个字节存放。UTF-16,16位Unicode编码方式。
2. 字符编码方案
2.1 单字节编码
单字节编码有7位字符集和8位的字符集。特点是,每个字符用一个字节表示。
1)单字节7位字符集,最常用的字符集为US7ASCII。
2)单字节8位字符集,适合于欧洲大部分国家 例如:WE8ISO8859P1(西欧、8位、ISO标准8859P1编码)
2.2 多字节编码
多字节编码有变长多字节编码和定长多字节编码。
1)变长多字节编码,它是指某些字符用一个字节表示,某些字符可以用2个或多个字节表示。例如,在一段文本中,既有欧美字符,也有亚洲语言字符,此时为了支持对亚洲语言的支持,我们需要用变长多字节编码。总之,变长多字节编码常用于对亚洲语言的支持, 例如日语、汉语、印地语等。常用的编码有:AL32UTF8,zhs16cgb231280。
例如:Oracle数据库指定了AL32UTF8字符集,并且创建了一个varchar(20)字段。如果要存放汉字的话,能存放几个呢?
由于指定了AL32UTF8字符集,因此,3个字节存放一个汉字。此外,创建了varchar(20)字段,表示varchar类型字段,最多能存储20个字节的汉字。因此我们可以推断出,这个字段最多能存放6个汉字。
2)定长多字节编码, 每一个字符都使用固定长度字节的编码方案,仅用于国家字符集。目前oracle唯一支持的定长多字节编码是AF16UTF16。
3. Unicode 编码
Unicode 编码涵盖了全世界所有已知字符的编码,是一种变长或多长的多字节编码方式。换句话说,它支持单字节和多字节的编码方式。目前Unicode有3.0版本和5.0版本。Unicode 5.0相比Unicode3.0 ,又增加了一些新的补充字符。Oracle unicde 编码方式有两类:一个是UTF-8, 另一个是UTF-16。
1) UTF-8 是Unicode 8位的编码方式,它是一种变长多字节的编码,这种编码方式可以用1,2,3个字节来表示一个Unicode字符。例如:AL32UTF8,UTF8、UTFE。
2) UTF-16是Unicode 16位的编码方式,它是一种定长多字节的编码,这种编码只能用2个字节来表示一个Unicode字符。例如:AF16UTF16。
4. 字符集超级
当一种字符集(字符集A)的编码数值包含所有另一种字符集(字符集B)的编码数值,并且两种字符集相同编码数值代表相同的字符时,则字符集A是字符集B的超级,或称字符集B是字符集A的子集。Oracle8i和oracle9i官方文档资料中备有子集-超级对照表(subsetsupersetpairs),例如:WE8ISO8859P1是WE8MSWIN1252的子集。由于US7ASCII是最早的Oracle数据库编码格式,因此有许多 字符集是US7ASCII的超集,例如WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK都是US7ASCII的超集。
5. Oracle数据库字符集(Oracle服务器端字符集)
Oracle服务器端字符集是在创建数据库时候指定的,在创建后通常不能更改。在创建数据库时,可以指定库字符集和国家字符集。
1)库字符集,它是Oracle基本的字符集,它支持单字节字符集,变长多字节字符集。作用是:
2)国家字符集,它是Oracle附加的字符集,其目的是为了增加Oracle 字符的处理能力。它解决了NCHAR等类型的定长多字节的编码的数据支持,然而Oracle的基本字符集并不能支持这点。国家字符集在oracle9i中进行了重新定义,只能在unicode编码中的AF16UTF16和UTF8 中选择,默认值是AF16UTF16。作用是:
6. 客户端字符集
客户端的字符集,是客户端定义的字符数据的编码方式。对所有来自客户端和发自客户端的字符数据均使用客户端定义的字符编码方式。客户端可以看作是能与数据库直接
连接的各种应用,如PL/SQL.Imp/Exp等。在Oralce里,客户端字符集是通过NLS_LANG参数设定的。