Mysql排序规则utf8_unicode_ci与utf8_general_ci的区别

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 |

+----------+-----------------------------+---------------------+

 

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’之间的间隔字母。

 

因为公司产品需要在日韩,东南亚等国家上线,需要考虑到排序规则。和公司DBA讨论,其实一般情况下是可以使用utf8_general_ci,综合评估使用utf8_general_ci,因为我们在查询的时候会比较多,所以考虑到性能问题。如果你的产品对正确性要求更高可以考虑使用utf8_unicode_ci。

你可能感兴趣的:(MySQL,Mysql,排序规则,utf8_unicode_ci,utf8_general_ci)