10.10. MySQL支持的字符集和校对
- 10.10.1. Unicode字符集
- 10.10.2. 西欧字符集
- 10.10.3. 中欧字符集
- 10.10.4. 南欧与中东字符集
- 10.10.5. 波罗的海字符集
- 10.10.6. 西里尔字符集
- 10.10.7. 亚洲字符集
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)执行的,校对规则描述见 http://www.unicode.org/reports/tr10/。此校对规则使用UCA 4.0.0版本砝码键:http://www.unicode.org/Public/UC一个/4.0.0/一个llkeys-4.0.0.txt。(以下讨论使用utf8_unicode_ci,但同样适合ucs2_unicode_ci。)
当前,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要影响越南和俄罗斯的一些少数民族语言,如:Udmurt、Tatar、Bashkir和Mari。
utf8_unicode_ci的最主要的特色是支持扩展,即当把一个字母看作与其它字母组合相等时。例如,在德语和一些其它语言中‘ß’等于‘ss’。
utf8_general_ci是一个遗留的校对规则,不支持扩展。它仅能够在字符之间进行逐个比较。这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用utf8_unicode_ci的校对规则相比,比较正确性较差)。
例如,使用utf8_general_ci和utf8_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_ci和utf8_spanish2_ci校对规则分别适用于现代和古典西班牙语。在两种校对规则中,ñ’(n-发音符)是‘n’和‘o’之间的间隔字母。另外,对于古典西班牙语,‘ch’是‘c’和d之间的间隔字母,并且‘ll’是‘l’和‘m’之间的间隔字母。
10.10.2. 西欧字符集
西欧字符集覆盖大多数西欧语言,如法语、西班牙语、加泰罗尼亚语、巴斯克人语、葡萄牙语、意大利语、阿而巴尼亚语、荷兰语、德语、丹麦语、瑞典语、挪威语、芬兰语、法罗人语、冰岛语、爱尔兰语、苏格兰语和英语。
·ascii(US ASCII)校对规则:
oascii_bin
oascii_general_ci(默认)
·cp850(DOS西欧)校对规则:
ocp850_bin
ocp850_general_ci(默认)
·dec8(DEC西欧)校对规则:
odec8_bin
odec8_swedish_ci(默认)
·hp8(HP西欧)校对规则:
ohp8_bin
ohp8_english_ci(默认)
·latin1(cp1252西欧)校对规则:
olatin1_bin
olatin1_danish_ci
olatin1_general_ci
olatin1_general_cs
olatin1_german1_ci
olatin1_german2_ci
olatin1_spanish_ci
olatin1_swedish_ci(默认)
latin1是默认字符集。latin1_swedish_ci是默认的校对规则,它用于大多数MySQL客户。虽然经常说它以瑞典/芬兰校对规则为基础,但瑞典和芬兰人不同意这种说法。
latin1_german1_ci和latin1_german2_ci校对规则基于DIN-1和DIN-2标准,这里DIN代表Deutsches Institut für Normung(德语等价于ANSI)。DIN-1被叫做“字典校对规则”,DIN-2被叫做“电话簿校对规则”。
olatin1_german1_ci(字典)规则:
o Ä = a
o Ö = O
o Ü = U
o ß = s
olatin1_german2_ci(电话簿)规则:
o Ä = aE
o Ö = OE
o Ü = UE
o ß = ss
在 latin1_spanish_ci校对规则中,‘ñ’(n-tilde)是‘n’和‘o’之间的间隔字母。
·macroma(Mac西欧)校对规则:
omacroman_bin
omacroman_general_ci(默认)
·swe7(7位瑞典语)校对规则:
oswe7_bin
oswe7_swedish_ci(默认)
10.10.3. 中欧字符集
我们还提供一些用于捷克共和国、斯洛伐克、匈牙利、罗马尼亚、斯罗纹尼亚、克罗地亚和波兰的字符集支持。·cp1250(Windows中欧)校对规则:
ocp1250_bin
ocp1250_croatian_ci
ocp1250_czech_cs
ocp1250_general_ci(默认)
·cp852(DOS中欧)校对规则:
ocp852_bin
ocp852_general_ci(默认)
·keybcs2(DOS Kamenicky Czech-Slovak)校对规则:
okeybcs2_bin
okeybcs2_general_ci(默认)
·latin2(ISO 8859-2 中欧)校对规则:
olatin2_bin
olatin2_croatian_ci
olatin2_czech_cs
olatin2_general_ci(默认)
olatin2_hungarian_ci
·macce(Mac中欧)校对规则:
omacce_bin
omacce_general_ci(默认)
10.10.4. 南欧与中东字符集
MySQL支持的南欧和中东字符集包括亚美尼亚语、阿拉伯语、乔治亚语、希腊语、希伯莱语和土耳其语:·armscii8(ARMSCII-8亚美尼亚语)校对规则:
oarmscii8_bin
oarmscii8_general_ci(默认)
·cp1256(阿拉伯语Windows)校对规则:
ocp1256_bin
ocp1256_general_ci(默认)
·geostd8(GEOSTD8乔治亚语)校对规则:
ogeostd8_bin
ogeostd8_general_ci(默认)
·greek(ISO 8859-7希腊语)校对规则:
ogreek_bin
ogreek_general_ci(默认)
·hebrew(ISO 8859-8希伯莱语)校对规则:
ohebrew_bin
ohebrew_general_ci(默认)
·latin5(ISO 8859-9 土耳其语)校对规则:
olatin5_bin
olatin5_turkish_ci(默认)
10.10.5. 波罗的海字符集
波罗的海字符集覆盖爱沙尼亚语、拉脱维亚语和立陶宛语言。当前支持的两种波罗的海字符集:·cp1257(Windows波罗的海)校对规则:
ocp1257_bin
ocp1257_general_ci(默认)
ocp1257_lithuanian_ci
·latin7(ISO 8859-13波罗的海)校对规则:
olatin7_bin
olatin7_estonian_cs
olatin7_general_ci(默认)
olatin7_general_cs
10.10.6. 西里尔字符集
使用西里尔字符集和校对规则的有Belarusian、保加利亚、俄语和乌克兰语言。·cp1251(Windows西里尔)校对规则:
ocp1251_bin
ocp1251_bulgarian_ci
ocp1251_general_ci(默认)
ocp1251_general_cs
ocp1251_ukrainian_ci
·cp866(DOS俄语)校对规则:
ocp866_bin
ocp866_general_ci(默认)
·koi8r(KOI8-R Relcom 俄语)校对规则:
okoi8r_bin
okoi8r_general_ci(默认)
·koi8u(KOI8-U乌克兰语)校对规则:
okoi8u_bin
okoi8u_general_ci(默认)
10.10.7. 亚洲字符集
- 10.10.7.1. cp932字符集
我们支持的亚洲字符集包括中文、日语、韩语和泰国语。这些可能比较复杂。例如,中文字符集必须考虑到上千种不同的字符。
·big5(Big5传统中文)校对规则:
obig5_bin
obig5_chinese_ci(默认)
·cp932(SJIS Windows日语)校对规则:
ocp932_bin
ocp932_japanese_ci(默认)
·eucjpms(UJIS Windows日语)校对规则:
oeucjpms_bin
oeucjpms_japanese_ci(默认)
·euckr(EUC-KR韩语)校对规则:
oeuckr_bin
oeuckr_korean_ci(默认)
·gb2312(GB2312简体中文)校对规则:
ogb2312_bin
ogb2312_chinese_ci(默认)
·gbk(GBK简体中文)校对规则:
ogbk_bin
ogbk_chinese_ci(默认)
·sjis(Shift-JIS日语)校对规则:
osjis_bin
osjis_japanese_ci(默认)
·tis620(TIS620泰国语)校对规则:
otis620_bin
otis620_thai_ci(默认)
·ujis(EUC-JP日语)校对规则:
oujis_bin
oujis_japanese_ci(默认)
10.10.7.1. cp932字符集
为什么需要cp932?
在MySQL中,sjis字符集对应于由IANA定义的Shift_JIS字符集,它支持JIS X0201和JIS X0208字符。(见 http://www.iana.org/assignments/character-sets。)
但是,“SHIFT JIS”作为描述性术语的含义变得非常含糊不清,并且它常常包括由不同供应商定义的Shift_JIS扩展部分。
例如,使用在日本Windows环境中使用的“SHIFT JIS”是Microsoft对Shift_JIS的Microsoft扩展,它的准确名字是Microsoft Windows Codepage: 932或cp932。除由Shift_JIS支持的字符之外,cp932支持扩展字符,如NEC选择的IBM扩展字符和IBM扩展字符。
许多日本用户在使用这些扩展字符过程中碰到过一些问题。这些问题是由于以下情况引起的:
·MySQL自动转换字符集。
·字符集通过Unicode转换(ucs2)。
·sjis字符集不支持这些扩展字符转换。
·从号称“SHIFT JIS”到Unicode的转换,存在一些转换规则,并且一些字符转换到Unicode依赖不同的转换规则。MySQL仅支持这些转换规则中的一种(在后面描述)。
MySQLcp932字符集可以解决这些转换问题。
因为MySQL支持字符集转换,将IANAShift_JIS和 cp932分离为两种不同字符集是重要的,因为它们提供不同的转换规则。
cp932与sjis有什么不同?
cp932字符集与sjis存在以下不同点:
·cp932支持NEC特殊字符、NEC选择的IBM扩展字符和IBM选择的字符。
·一些cp932字符有两个不同的编码点,这两种编码点转换为相同Unicode编码点。因此,当从Unicode转换回到cp932时,必须选择一个编码点。对于这种“相互转换”,使用由Microsoft推荐的转换规则。(见 http://support.microsoft.com/kb/170559/EN-US/。)
转换规则如下:
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表中的带有下面有四位数字出现的字符的实体,数字代表相应的Unicode(ucs2)编码。对于表中有两个带下划线的数字出现的实体,择有一个以那两个数字开头的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
·cp932与eucjpms结合支持用户自定义字符的转换,并且解决sjis/ujis转换问题。详细信息,请参见http://www.opengroup.or.jp/jvc/cde/sjis-euc-e.html。
·对于一些字符,与ucs2之间的转换与sjis和cp932之间的转换是不同的。下表举例说明了这些不同。
转换到ucs2:
sjis/cp932值 | sjis→ucs2转换 | 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。 原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。