分类: Mysql/postgreSQL
2008-05-11 19:39:50
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';
关于MySQL从4.1以前的版本到5.1版本字符集升级的信息,请参见MySQL4.1参考手册。
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 | +----------+-----------------------------+---------------------+
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 、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’之间的间隔字母。
西欧字符集覆盖大多数西欧语言,如法语、西班牙语、加泰罗尼亚语、巴斯克人语、葡萄牙语、意大利语、阿而巴尼亚语、荷兰语、德语、丹麦语、瑞典语、挪威语、芬兰语、法罗人语、冰岛语、爱尔兰语、苏格兰语和英语。
· ascii(US ASCII)校对规则:
o ascii_bin
o ascii_general_ci( 默认)
· cp850(DOS西欧) 校对规则:
o cp850_bin
o cp850_general_ci( 默认)
· dec8(DEC 西欧)校对规则:
o dec8_bin
o dec8_swedish_ci( 默认)
· hp8(HP 西欧)校对规则:
o hp8_bin
o hp8_english_ci( 默认)
· latin1(cp1252 西欧)校对规则:
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_ci和latin1_german2_ci校对规则基于DIN-1和DIN-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’之间的间隔字母。
· macroma(Mac西欧) 校对规则:
o macroman_bin
o macroman_general_ci( 默认)
· swe7(7位瑞典语) 校对规则:
o swe7_bin
o swe7_swedish_ci( 默认)
· cp1250(Windows中欧) 校对规则:
o cp1250_bin
o cp1250_croatian_ci
o cp1250_czech_cs
o cp1250_general_ci( 默认)
· cp852(DOS 中欧)校对规则:
o cp852_bin
o cp852_general_ci( 默认)
· keybcs2(DOS Kamenicky Czech-Slovak)校对规则:
o keybcs2_bin
o keybcs2_general_ci( 默认)
· latin2(ISO 8859-2 中欧)校对规则:
o latin2_bin
o latin2_croatian_ci
o latin2_czech_cs
o latin2_general_ci( 默认)
o latin2_hungarian_ci
· macce(Mac 中欧)校对规则:
o macce_bin
o macce_general_ci( 默认)
· armscii8(ARMSCII-8 亚美尼亚语)校对规则:
o armscii8_bin
o armscii8_general_ci( 默认)
· cp1256(阿拉伯语Windows) 校对规则:
o cp1256_bin
o cp1256_general_ci( 默认)
· geostd8(GEOSTD8乔治亚语) 校对规则:
o geostd8_bin
o geostd8_general_ci( 默认)
· greek(ISO 8859-7希腊语)校对规则:
o greek_bin
o greek_general_ci( 默认)
· hebrew(ISO 8859-8希伯莱语)校对规则:
o hebrew_bin
o hebrew_general_ci( 默认)
· latin5(ISO 8859-9 土耳其语)校对规则:
o latin5_bin
o latin5_turkish_ci( 默认)
· cp1257(Windows波罗的海) 校对规则:
o cp1257_bin
o cp1257_general_ci( 默认)
o cp1257_lithuanian_ci
· latin7(ISO 8859-13波罗的海)校对规则:
o latin7_bin
o latin7_estonian_cs
o latin7_general_ci( 默认)
o latin7_general_cs
· cp1251(Windows 西里尔)校对规则:
o cp1251_bin
o cp1251_bulgarian_ci
o cp1251_general_ci( 默认)
o cp1251_general_cs
o cp1251_ukrainian_ci
· cp866(DOS 俄语)校对规则:
o cp866_bin
o cp866_general_ci( 默认)
· koi8r(KOI8-R Relcom 俄语)校对规则:
o koi8r_bin
o koi8r_general_ci( 默认)
· koi8u(KOI8-U 乌克兰语)校对规则:
o koi8u_bin
o koi8u_general_ci( 默认)
我们支持的亚洲字符集包括中文、日语、韩语和泰国语。这些可能比较复杂。例如,中文字符集必须考虑到上千种不同的字符。
· big5(Big5传统中文) 校对规则:
o big5_bin
o big5_chinese_ci( 默认)
· cp932(SJIS Windows日语)校对规则:
o cp932_bin
o cp932_japanese_ci( 默认)
· eucjpms(UJIS Windows日语)校对规则:
o eucjpms_bin
o eucjpms_japanese_ci( 默认)
· euckr(EUC-KR 韩语)校对规则:
o euckr_bin
o euckr_korean_ci( 默认)
· gb2312(GB2312 简体中文)校对规则:
o gb2312_bin
o gb2312_chinese_ci( 默认)
· gbk(GBK简体中文) 校对规则:
o gbk_bin
o gbk_chinese_ci( 默认)
· sjis(Shift-JIS 日语)校对规则:
o sjis_bin
o sjis_japanese_ci( 默认)
· tis620(TIS620 泰国语)校对规则:
o tis620_bin
o tis620_thai_ci( 默认)
· ujis(EUC-JP 日语)校对规则:
o ujis_bin
o ujis_japanese_ci( 默认)
为什么需要cp932?
在MySQL中,sjis字符集对应于由IANA定义的Shift_JIS字符集,它支持JIS X0201和JIS X0208字符。(见 。)
但是,“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支持字符集转换,将IANA Shift_JIS 和 cp932分离为两种不同字符集是重要的,因为它们提供不同的转换规则。
cp932与sjis有什么不同?
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表中的带有下面有四位数字出现的字符的实体,数字代表相应的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转换问题。详细信息,请参见。
· 对于一些字符,与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。 原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。