Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92424779
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Mysql/postgreSQL

2008-05-11 19:39:50

10.9. 国家特有字符集

ANSI SQL定义了NCHAR或者NATIONAL CHAR作为一个方法来指示CHAR类型的列应该使用某些预定义的字符集。MySQL5.1使用utf8作为预定义的字符集。例如,这些列类型声明是等价的:
CHAR(10) CHARACTER SET utf8
NATIONAL CHARACTER(10)
NCHAR(10)

下面同样:

VARCHAR(10) CHARACTER SET utf8
NATIONAL VARCHAR(10)
NCHAR VARCHAR(10)
NATIONAL CHARACTER VARYING(10)
NATIONAL CHAR VARYING(10)

你能够使用N'literal'来创建一个使用国家特有字符集的字符串。这两个语句是等价的:

SELECT N'some text';
SELECT _utf8'some text';

关于MySQL4.1以前的版本到5.1版本字符集升级的信息,请参见MySQL4.1参考手册

10.10. MySQL支持的字符集和校对

MySQL支持30多种字符集的70多种 校对规则。字符集和它们的默认校对规则可以通过SHOW CHARACTER SET语句显示:

mysql> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+
| Charset  | Description                 | Default collation   |
+----------+-----------------------------+---------------------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |
| dec8     | DEC West European           | dec8_swedish_ci     |
| cp850    | DOS West European           | cp850_general_ci    |
| hp8      | HP West European            | hp8_english_ci      |
| koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |
| latin1   | cp1252 West European        | latin1_swedish_ci   |
| latin2   | ISO 8859-2 Central European | latin2_general_ci   |
| swe7     | 7bit Swedish                | swe7_swedish_ci     |
| ascii    | US ASCII                    | ascii_general_ci    |
| ujis     | EUC-JP Japanese             | ujis_japanese_ci    |
| sjis     | Shift-JIS Japanese          | sjis_japanese_ci    |
| hebrew   | ISO 8859-8 Hebrew           | hebrew_general_ci   |
| tis620   | TIS620 Thai                 | tis620_thai_ci      |
| euckr    | EUC-KR Korean               | euckr_korean_ci     |
| koi8u    | KOI8-U Ukrainian            | koi8u_general_ci    |
| gb2312   | GB2312 Simplified Chinese   | gb2312_chinese_ci   |
| greek    | ISO 8859-7 Greek            | greek_general_ci    |
| cp1250   | Windows Central European    | cp1250_general_ci   |
| gbk      | GBK Simplified Chinese      | gbk_chinese_ci      |
| latin5   | ISO 8859-9 Turkish          | latin5_turkish_ci   |
| armscii8 | ARMSCII-8 Armenian          | armscii8_general_ci |
| utf8     | UTF-8 Unicode               | utf8_general_ci     |
| ucs2     | UCS-2 Unicode               | ucs2_general_ci     |
| cp866    | DOS Russian                 | cp866_general_ci    |
| keybcs2  | DOS Kamenicky Czech-Slovak  | keybcs2_general_ci  |
| macce    | Mac Central European        | macce_general_ci    |
| macroman | Mac West European           | macroman_general_ci |
| cp852    | DOS Central European        | cp852_general_ci    |
| latin7   | ISO 8859-13 Baltic          | latin7_general_ci   |
| cp1251   | Windows Cyrillic            | cp1251_general_ci   |
| cp1256   | Windows Arabic              | cp1256_general_ci   |
| cp1257   | Windows Baltic              | cp1257_general_ci   |
| binary   | Binary pseudo charset       | binary              |
| geostd8  | GEOSTD8 Georgian            | geostd8_general_ci  |
| cp932    | SJIS for Windows Japanese   | cp932_japanese_ci   |
| eucjpms  | UJIS for Windows Japanese   | eucjpms_japanese_ci |
+----------+-----------------------------+---------------------+

10.10.1. Unicode字符集

MySQL有两种Unicode字符集。你能够使用这些字符集保存大约650种语言的文本。

·         ucs2 (UCS-2 Unicode)校对规则:

  • mysql> SHOW COLLATION LIKE 'ucs2%';
    +--------------------+---------+-----+---------+----------+---------+
    | Collation          | Charset | Id  | Default | Compiled | Sortlen |
    +--------------------+---------+-----+---------+----------+---------+
    | ucs2_general_ci    | ucs2    |  35 | Yes     | Yes      |       1 |
    | ucs2_bin           | ucs2    |  90 |         | Yes      |       1 |
    | ucs2_unicode_ci    | ucs2    | 128 |         | Yes      |       8 |
    | ucs2_icelandic_ci  | ucs2    | 129 |         | Yes      |       8 |
    | ucs2_latvian_ci    | ucs2    | 130 |         | Yes      |       8 |
    | ucs2_romanian_ci   | ucs2    | 131 |         | Yes      |       8 |
    | ucs2_slovenian_ci  | ucs2    | 132 |         | Yes      |       8 |
    | ucs2_polish_ci     | ucs2    | 133 |         | Yes      |       8 |
    | ucs2_estonian_ci   | ucs2    | 134 |         | Yes      |       8 |
    | ucs2_spanish_ci    | ucs2    | 135 |         | Yes      |       8 |
    | ucs2_swedish_ci    | ucs2    | 136 |         | Yes      |       8 |
    | ucs2_turkish_ci    | ucs2    | 137 |         | Yes      |       8 |
    | ucs2_czech_ci      | ucs2    | 138 |         | Yes      |       8 |
    | ucs2_danish_ci     | ucs2    | 139 |         | Yes      |       8 |
    | ucs2_lithuanian_ci | ucs2    | 140 |         | Yes      |       8 |
    | ucs2_slovak_ci     | ucs2    | 141 |         | Yes      |       8 |
    | ucs2_spanish2_ci   | ucs2    | 142 |         | Yes      |       8 |
    | ucs2_roman_ci      | ucs2    | 143 |         | Yes      |       8 |
    | ucs2_persian_ci    | ucs2    | 144 |         | Yes      |       8 |
    | ucs2_esperanto_ci  | ucs2    | 145 |         | Yes      |       8 |
    +--------------------+---------+-----+---------+----------+---------+
    
  • utf8 (UTF-8 Unicode)校对规则:

    mysql> SHOW COLLATION LIKE 'utf8%';
    +--------------------+---------+-----+---------+----------+---------+
    | Collation          | Charset | Id  | Default | Compiled | Sortlen |
    +--------------------+---------+-----+---------+----------+---------+
    | utf8_general_ci    | utf8    |  33 | Yes     | Yes      |       1 |
    | utf8_bin           | utf8    |  83 |         | Yes      |       1 |
    | utf8_unicode_ci    | utf8    | 192 |         | Yes      |       8 |
    | utf8_icelandic_ci  | utf8    | 193 |         | Yes      |       8 |
    | utf8_latvian_ci    | utf8    | 194 |         | Yes      |       8 |
    | utf8_romanian_ci   | utf8    | 195 |         | Yes      |       8 |
    | utf8_slovenian_ci  | utf8    | 196 |         | Yes      |       8 |
    | utf8_polish_ci     | utf8    | 197 |         | Yes      |       8 |
    | utf8_estonian_ci   | utf8    | 198 |         | Yes      |       8 |
    | utf8_spanish_ci    | utf8    | 199 |         | Yes      |       8 |
    | utf8_swedish_ci    | utf8    | 200 |         | Yes      |       8 |
    | utf8_turkish_ci    | utf8    | 201 |         | Yes      |       8 |
    | utf8_czech_ci      | utf8    | 202 |         | Yes      |       8 |
    | utf8_danish_ci     | utf8    | 203 |         | Yes      |       8 |
    | utf8_lithuanian_ci | utf8    | 204 |         | Yes      |       8 |
    | utf8_slovak_ci     | utf8    | 205 |         | Yes      |       8 |
    | utf8_spanish2_ci   | utf8    | 206 |         | Yes      |       8 |
    | utf8_roman_ci      | utf8    | 207 |         | Yes      |       8 |
    | utf8_persian_ci    | utf8    | 208 |         | Yes      |       8 |
    | utf8_esperanto_ci  | utf8    | 209 |         | Yes      |       8 |
    +--------------------+---------+-----+---------+----------+---------+
    

utf8_unicode_ci校对规则是根据Unicode校对规则算法(UCA)执行的, 校对规则描述见 。此校对规则使用UCA 4.0.0版本砝码键:。(以下讨论使用utf8_unicode_ci,但同样适合ucs2_unicode_ci。)

当前,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要影响越南和俄罗斯的一些少数民族语言,如:Udmurt TatarBashkirMari

utf8_unicode_ci的最主要的特色是支持扩展,即当把一个字母看作与其它字母组合相等时。例如,在德语和一些其它语言中‘ß’等于‘ss’。

utf8_general_ci是一个遗留的 校对规则,不支持扩展。它仅能够在字符之间进行逐个比较。这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用utf8_unicode_ci的 校对规则相比,比较正确性较差)。

例如,使用utf8_general_ciutf8_unicode_ci两种 校对规则下面的比较相等:

Ä = A
Ö = O
Ü = U

两种校对规则之间的区别是,对于utf8_general_ci下面的等式成立:

ß = s

但是,对于utf8_unicode_ci下面等式成立:

ß = ss

对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集 校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。

utf8_general_ci也适用与德语和法语,除了‘ß’等于‘s’,而不是‘ss’之外。如果你的应用能够接受这些,那么应该使用utf8_general_ci因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。

utf8_swedish_ci,与其它语言相关的utf8的校对规则相似,来源于utf8_unicode_ci使用额外的语言规则。例如,在瑞典语中,以下的关系式成立,它在德语和法语中不成立:

Ü = Y < Ö

utf8_spanish_ciutf8_spanish2_ci校对规则分别适用于现代和古典西班牙语。在两种 校对规则中,ñ’(n-发音符)是‘n’和‘o’之间的间隔字母。另外,对于古典西班牙语,‘ch’是‘c’和d之间的间隔字母,并且‘ll’是‘l’和‘m’之间的间隔字母。

10.10.2. 西欧字符集

西欧字符集覆盖大多数西欧语言,如法语、西班牙语、加泰罗尼亚语、巴斯克人语、葡萄牙语、意大利语、阿而巴尼亚语、荷兰语、德语、丹麦语、瑞典语、挪威语、芬兰语、法罗人语、冰岛语、爱尔兰语、苏格兰语和英语。

·         asciiUS ASCII)校对规则:

o        ascii_bin

o        ascii_general_ci( 默认)

·         cp850DOS西欧) 校对规则:

o        cp850_bin

o        cp850_general_ci( 默认)

·         dec8DEC 西欧)校对规则:

o        dec8_bin

o        dec8_swedish_ci( 默认)

·         hp8HP 西欧)校对规则:

o        hp8_bin

o        hp8_english_ci( 默认)

·         latin1cp1252 西欧)校对规则:

o        latin1_bin

o        latin1_danish_ci

o        latin1_general_ci

o        latin1_general_cs

o        latin1_german1_ci

o        latin1_german2_ci

o        latin1_spanish_ci

o        latin1_swedish_ci( 默认)

latin1是 默认字符集。latin1_swedish_ci是 默认的校对规则,它用于大多数MySQL客户。虽然经常说它以瑞典/芬兰 校对规则为基础,但瑞典和芬兰人不同意这种说法。

latin1_german1_cilatin1_german2_ci校对规则基于DIN-1DIN-2标准,这里DIN代表Deutsches Institut für Normung(德语等价于ANSI)。DIN-1被叫做“字典校对规则”,DIN-2被叫做“电话簿校对规则”。

o        latin1_german1_ci(字典)规则:

o                     Ä = a
o                     Ö = O
o                     Ü = U
o                     ß = s

o        latin1_german2_ci电话簿)规则:

o                     Ä = aE
o                     Ö = OE
o                     Ü = UE
o                     ß = ss

latin1_spanish_ci校对规则中,‘ñ’(n-tilde)是‘n’和‘o’之间的间隔字母。

·         macromaMac西欧) 校对规则:

o        macroman_bin

o        macroman_general_ci( 默认)

·         swe77位瑞典语) 校对规则:

o        swe7_bin

o        swe7_swedish_ci( 默认)

10.10.3. 中欧字符集

我们还提供一些用于捷克共和国、斯洛伐克、匈牙利、罗马尼亚、斯罗纹尼亚、克罗地亚和波兰的字符集支持。

·         cp1250Windows中欧) 校对规则:

o        cp1250_bin

o        cp1250_croatian_ci

o        cp1250_czech_cs

o        cp1250_general_ci( 默认)

·         cp852DOS 中欧)校对规则:

o        cp852_bin

o        cp852_general_ci( 默认)

·         keybcs2DOS Kamenicky Czech-Slovak)校对规则:

o        keybcs2_bin

o        keybcs2_general_ci( 默认)

·         latin2ISO 8859-2 中欧)校对规则:

o        latin2_bin

o        latin2_croatian_ci

o        latin2_czech_cs

o        latin2_general_ci( 默认)

o        latin2_hungarian_ci

·         macceMac 中欧)校对规则:

o        macce_bin

o        macce_general_ci( 默认)

10.10.4. 南欧与中东字符集

MySQL支持的南欧和中东字符集包括亚美尼亚语、阿拉伯语、乔治亚语、希腊语、希伯莱语和土耳其语:

·         armscii8ARMSCII-8 亚美尼亚语)校对规则:

o        armscii8_bin

o        armscii8_general_ci( 默认)

·         cp1256(阿拉伯语Windows) 校对规则:

o        cp1256_bin

o        cp1256_general_ci( 默认)

·         geostd8GEOSTD8乔治亚语) 校对规则:

o        geostd8_bin

o        geostd8_general_ci( 默认)

·         greekISO 8859-7希腊语)校对规则:

o        greek_bin

o        greek_general_ci( 默认)

·         hebrewISO 8859-8希伯莱语)校对规则:

o        hebrew_bin

o        hebrew_general_ci( 默认)

·         latin5ISO 8859-9 土耳其语)校对规则:

o        latin5_bin

o        latin5_turkish_ci( 默认)

10.10.5. 波罗的海字符集

波罗的海字符集覆盖爱沙尼亚语、拉脱维亚语和立陶宛语言。当前支持的两种波罗的海字符集:

·         cp1257Windows波罗的海) 校对规则:

o        cp1257_bin

o        cp1257_general_ci( 默认)

o        cp1257_lithuanian_ci

·         latin7ISO 8859-13波罗的海)校对规则:

o        latin7_bin

o        latin7_estonian_cs

o        latin7_general_ci( 默认)

o        latin7_general_cs

10.10.6. 西里尔字符集

使用西里尔字符集和校对规则的有Belarusian、保加利亚、俄语和乌克兰语言。

·         cp1251Windows 西里尔)校对规则:

o        cp1251_bin

o        cp1251_bulgarian_ci

o        cp1251_general_ci( 默认)

o        cp1251_general_cs

o        cp1251_ukrainian_ci

·         cp866DOS 俄语)校对规则:

o        cp866_bin

o        cp866_general_ci( 默认)

·         koi8rKOI8-R Relcom 俄语)校对规则:

o        koi8r_bin

o        koi8r_general_ci( 默认)

·         koi8uKOI8-U 乌克兰语)校对规则:

o        koi8u_bin

o        koi8u_general_ci( 默认)

10.10.7. 亚洲字符集

我们支持的亚洲字符集包括中文、日语、韩语和泰国语。这些可能比较复杂。例如,中文字符集必须考虑到上千种不同的字符。

·         big5Big5传统中文) 校对规则:

o        big5_bin

o        big5_chinese_ci( 默认)

·         cp932SJIS Windows日语)校对规则:

o        cp932_bin

o        cp932_japanese_ci( 默认)

·         eucjpmsUJIS Windows日语)校对规则:

o        eucjpms_bin

o        eucjpms_japanese_ci( 默认)

·         euckrEUC-KR 韩语)校对规则:

o        euckr_bin

o        euckr_korean_ci( 默认)

·         gb2312GB2312 简体中文)校对规则:

o        gb2312_bin

o        gb2312_chinese_ci( 默认)

·         gbkGBK简体中文) 校对规则:

o        gbk_bin

o        gbk_chinese_ci( 默认)

·         sjisShift-JIS 日语)校对规则:

o        sjis_bin

o        sjis_japanese_ci( 默认)

·         tis620TIS620 泰国语)校对规则:

o        tis620_bin

o        tis620_thai_ci( 默认)

·         ujisEUC-JP 日语)校对规则:

o        ujis_bin

o        ujis_japanese_ci( 默认)

10.10.7.1. cp932字符集

为什么需要cp932

MySQL中,sjis字符集对应于由IANA定义的Shift_JIS字符集,它支持JIS X0201JIS X0208字符。(见 。)

但是,“SHIFT JIS”作为描述性术语的含义变得非常含糊不清,并且它常常包括由不同供应商定义的Shift_JIS扩展部分。

例如,使用在日本Windows环境中使用的“SHIFT JIS”是MicrosoftShift_JISMicrosoft扩展,它的准确名字是Microsoft Windows Codepage: 932cp932除由Shift_JIS支持的字符之外,cp932支持扩展字符,如NEC选择的IBM扩展字符和IBM扩展字符。

许多日本用户在使用这些扩展字符过程中碰到过一些问题。这些问题是由于以下情况引起的:

·         MySQL自动转换字符集。

·         字符集通过Unicode转换(ucs2)。

·         sjis字符集不支持这些扩展字符转换。

·         从号称“SHIFT JIS”到Unicode的转换,存在一些转换规则,并且一些字符转换到Unicode依赖不同的转换规则。MySQL仅支持这些转换规则中的一种(在后面描述)。

MySQLcp932字符集可以解决这些转换问题。

因为MySQL支持字符集转换,将IANA Shift_JIS cp932分离为两种不同字符集是重要的,因为它们提供不同的转换规则。

cp932sjis有什么不同?

cp932字符集与sjis存在以下不同点:

·         cp932支持NEC特殊字符、NEC选择的IBM扩展字符和IBM选择的字符。

·         一些cp932字符有两个不同的编码点,这两种编码点转换为相同Unicode编码点。因此,当从Unicode转换回到cp932时,必须选择一个编码点。对于这种“相互转换使用由Microsoft推荐的转换规则。(见 。)

转换规则如下:

o        如果字符在JIS X 0208 NEC特殊字符中同时存在,使用JIS X 0208 的编码点。

o        如果字符在NEC特殊字符和IBM选择的字符中同时存在,使用NEC特殊字符的编码点。

o        如果字符在IBM选择的字符和NEC选择的IBM扩展字符中同时存在,使用IBM扩展字符的编码点。

关于cp932字符的Unicode 值的列表显示信息见http://www.microsoft.com/globaldev/reference/dbcs/932.htm。对于cp932表中的带有下面有四位数字出现的字符的实体,数字代表相应的Unicodeucs2)编码。对于表中有两个带下划线的数字出现的实体,择有一个以那两个数字开头的cp932字符值的范围。点击一个这种表的实体,将带你到一个页,该页显示每个以那些数字开头的cp932字符的Unicode值。

以下连接很重要。它们与下列字符集的编码相对应:

o        NEC特殊字符:

http://www.microsoft.com/globaldev/reference/dbcs/932/932_87.htm

o        NEC选择的IBM扩展字符:

o                     http://www.microsoft.com/globaldev/reference/dbcs/932/932_ED.htm
o                     http://www.microsoft.com/globaldev/reference/dbcs/932/932_EE.htm

o        IBM选择的字符:

o                     http://www.microsoft.com/globaldev/reference/dbcs/932/932_FA.htm
o                     http://www.microsoft.com/globaldev/reference/dbcs/932/932_FB.htm
o                     http://www.microsoft.com/globaldev/reference/dbcs/932/932_FC.htm

·         cp932eucjpms结合支持用户自定义字符的转换,并且解决sjis/ujis转换问题。详细信息,请参见

·         对于一些字符,与ucs2之间的转换与sjiscp932之间的转换是不同的。下表举例说明了这些不同。

转换到ucs2

sjis/cp932

sjisucs2转换

cp932 ucs2转换

5C

005C

005C

7E

007E

007E

815C

2015

2015

815F

005C

FF3C

8160

301C

FF5E

8161

2016

2225

817C

2212

FF0D

8191

00a2

FFE0

8192

00a3

FFE1

81Ca

00aC

FFE2

ucs2转换:

ucs2

ucs2 sjis转换

ucs2 cp932转换

005C

815F

5C

007E

7E

7E

00a2

8191

3F

00a3

8192

3F

00aC

81Ca

3F

2015

815C

815C

2016

8161

3F

2212

817C

3F

2225

3F

8161

301C

8160

3F

FF0D

3F

817C

FF3C

3F

815F

FF5E

3F

8160

FFE0

3F

8191

FFE1

3F

8192

FFE2

3F

81Ca


这是MySQL参考手册的翻译版本,关于MySQL参考手册,请访问dev.mysql.com。 原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。

阅读(509) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~