MySQL字符集(character set)、排序规则(collation)和Unicode的详解

1.字符集和排序规则

字符集(character set)是一组符号(symbol)和编码(encoding)。排序规则(collation)是一 组用于比较字符集中的字符的规则。

假设我们有一个包含四个字母的字母表: ABab。我们给每个字母一个数字: A= 0, B= 1, a= 2, b= 3。字母 A是一个符号,数字 0 代表 A 的 编码,所有四个字母及其编码的组合就是一个 字符集。

假设我们要比较两个字符串值, AB。最简单的方法是查看编码:0 代表A 和 1 代表B。因为 0 小于 1,所以我们说 A小于B。我们刚刚所做的是将排序规则应用于我们的字符集。排序规则是一组规则(在这种情况下只有一个规则):“比较编码”。我们将所有可能的排序规则中最简单的称为 二进制排序规则。

但是如果我们想说小写字母和大写字母是相等的呢?那么我们至少有两条规则:(1)将小写字母a和 b视为等于A 和 B;(2) 然后比较编码。我们称之为不区分大小写的 排序规则。它比二进制排序规则复杂一点。

在现实生活中,大多数字符集都有许多字符:整个字母表不仅仅是 AB,有时还有多个字母表或具有数千个字符的东方书写系统,以及许多特殊符号和标点符号。同样在现实生活中,大多数排序规则都有很多规则,不仅仅是是否区分字母大小写,还有是否区分重音(Accent)(“重音”是附加在字符上的标记,如德语Ö),以及多字符映射(例如:在两个德语排序规则之一中Ö=OE的规则)。

2.MySQL字符集和排序规则

MySQL默认的字符集是utf8mb4,排序规则是utf8mb4_0900_ai_ci

要显示可用的字符集,请使用SHOW CHARACTER SET语句。

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

给定的字符集总是至少有一个排序规则,并且大多数字符集都有几个。要列出字符集的显示排序规则,请使用 SHOW COLLATION语句。

mysql> SHOW COLLATION WHERE Charset = 'utf8mb4';

3.Unicode 字符集

字符集支持的字符每个字符所需的存储空间
utf8mb3utf8(已弃用)仅 BMP1、2 或 3 个字节
ucs2(已弃用)仅 BMP2 个字节
utf8mb4BMP 和补充1、2、3 或 4 个字节
utf16BMP 和补充2 或 4 个字节
utf16leBMP 和补充2 或 4 个字节
utf32BMP 和补充4字节

4.排序规则命名约定

排序规则名称以与其关联的字符集的名称开头,通常后跟一个或多个表示其他排序规则特征的后缀。

如果排序规则名称不包含_ai_as_ci则隐式包含_ai_cs则隐式包含_as

后缀意义
_aiAccent-insensitive(重音不敏感)
_asAccent-sensitive(重音敏感)
_ciCase-insensitive(不区分大小写)
_csCase-sensitive(区分大小写)
_ksKana-sensitive(日文假名敏感)
_binBinary(二进制)

5.National Character Set

National前缀表示列应该使用预定义字符集,MySQL使用utf8作为预定义字符集,而utf8当前是utf8mb3的别名,还未切换为utf8mb4的别名,所以一般不使用National前缀。

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

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/experience/sqlexp/15835.html

(0)
huoxiaoqiang的头像huoxiaoqiang
上一篇 2022年1月5日
下一篇 2022年8月2日

相关推荐

发表回复

登录后才能评论