查看MySQL支持的Charset和Collation

查看Charset

MySQL支持了很多种Charset以及Collation,可以使用如下语句查看支持的Charset,其中Charset列代表字符集的名称、Description列代表描述、Default collation列代表该字符集的默认校对规则、Maxlen列代表该字符集中最长编码的字节数:

mysql> SHOW CHARACTER SET; -- 对应视图INFORMATION_SCHEMA.CHARACTER_SETS
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| binary   | Binary pseudo charset           | binary              |      1 |
...
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
...
| ucs2     | UCS-2 Unicode                   | ucs2_general_ci     |      2 |
...
| utf8mb3  | UTF-8 Unicode                   | utf8mb3_general_ci  |      3 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_0900_ai_ci  |      4 |
...

查看Collation

MySQL 8.0默认使用的Charsetutf8mb4,这里以它为例使用如下语句查看该字符集可以使用的Collation,其中Compiled列代表该Collation是否在MySQL源码中实现:

mysql> SHOW COLLATION WHERE Charset = 'utf8mb4'; -- 对应视图INFORMATION_SCHEMA.COLLATIONS
+----------------------------+---------+-----+---------+----------+---------+---------------+
| Collation                  | Charset | Id  | Default | Compiled | Sortlen | Pad_attribute |
+----------------------------+---------+-----+---------+----------+---------+---------------+
| utf8mb4_0900_ai_ci         | utf8mb4 | 255 | Yes     | Yes      |       0 | NO PAD        |
| utf8mb4_0900_as_ci         | utf8mb4 | 305 |         | Yes      |       0 | NO PAD        |
| utf8mb4_0900_as_cs         | utf8mb4 | 278 |         | Yes      |       0 | NO PAD        |
| utf8mb4_0900_bin           | utf8mb4 | 309 |         | Yes      |       1 | NO PAD        |
| utf8mb4_bin                | utf8mb4 |  46 |         | Yes      |       1 | PAD SPACE     |
...
| utf8mb4_general_ci         | utf8mb4 |  45 |         | Yes      |       1 | PAD SPACE     |
...
| utf8mb4_spanish2_ci        | utf8mb4 | 238 |         | Yes      |       8 | PAD SPACE     |
...
| utf8mb4_unicode_520_ci     | utf8mb4 | 246 |         | Yes      |       8 | PAD SPACE     |
| utf8mb4_unicode_ci         | utf8mb4 | 224 |         | Yes      |       8 | PAD SPACE     |
...
| utf8mb4_zh_0900_as_cs      | utf8mb4 | 308 |         | Yes      |       0 | NO PAD        |
+----------------------------+---------+-----+---------+----------+---------+---------------+

MySQL中,CharsetCollation遵循以下规则:

  • 同一个Collation不能被多个Charset使用,也就是Collation依附于某一个Charset

  • 每个Charset都有一个默认Collation

CollationPad_attribute

查看Collation信息时可以发现有一个Pad_attribute列,其值为“NO PAD”或“PAD SPACE”,这定义了Collation对待字符串尾部空格的态度。MySQL中大部分Collation该属性为“PAD SPACE”,基于UCA 9.0.0(名称中带0900字样)实现的Collation该属性为“NO PAD”:

  • PAD SPACE:当比较(不包括LIKE)两个字符串的时候,尾部空格将被忽略,例如认为"a"与"a "相等

  • NO PAD:当比较两个字符串的时候,尾部空格不能忽略,例如认为"a"与"a "不等

  • 使用LIKE操作符时,不受该值影响,尾部空格不能忽略

mysql> SELECT COLLATION_NAME, PAD_ATTRIBUTE
       FROM INFORMATION_SCHEMA.COLLATIONS
       WHERE COLLATION_NAME LIKE 'utf8mb4%bin';
+------------------+---------------+
| COLLATION_NAME   | PAD_ATTRIBUTE |
+------------------+---------------+
| utf8mb4_bin      | PAD SPACE     |
| utf8mb4_0900_bin | NO PAD        |
+------------------+---------------+

-- 1. 具有'PAD SPACE'属性的utf8mb4_bin认为'a '='a'
mysql> SELECT 'a ' = 'a' COLLATE utf8mb4_bin;
+--------------------------------+
| 'a ' = 'a' COLLATE utf8mb4_bin |
+--------------------------------+
|                              1 |
+--------------------------------+
-- 2. 具有'NO PAD'属性的utf8mb4_0900_bin认为'a '!='a'
mysql> SELECT 'a ' = 'a' COLLATE utf8mb4_0900_bin;
+-------------------------------------+
| 'a ' = 'a' COLLATE utf8mb4_0900_bin |
+-------------------------------------+
|                                   0 |
+-------------------------------------+
-- 3. LIKE操作符不受'PAD SPACE'影响,尾部空格不可忽略
mysql> SELECT 'a ' LIKE 'a' COLLATE utf8mb4_bin;
+-----------------------------------+
| 'a ' LIKE 'a' COLLATE utf8mb4_bin |
+-----------------------------------+
|                                 0 |
+-----------------------------------+

Collation的命名规则

  • Collation名称以其关联的Charset名称开头,通常后面跟着一个或多个后缀,表示其他特征。例如,utf8mb4_0900_ai_cilatin1_swedish_ci分别是utf8mb4latin1Collation。binary Charset只有一个Collation,也命名为binary,没有后缀。

  • 对于特定语言的Collation包括一个区域代码或语言名称。例如,utf8mb4_tr_0900_ai_ciutf8mb4_hu_0900_ai_ci中的_tr和_hu分别代表使用土耳其语和匈牙利语的规则对utf8mb4中的字符进行排序。

  • Collation后缀表示校对规则是否区分大小写、音调、平(片)假名,或者是二进制的,下表显示了用于表示这些特征的后缀。如果Collation名称中不包含_ai或_as,那么名称中的_ci隐喻着_ai(例如utf8mb4_unicode_ci既不区分音调也不区分大小写),名称中的_cs隐喻着_as(例如latin1_general_cs既区分音调也区分大小写):

后缀

含义

_ai

不区分音调,例如认为'a' = 'á'

_as

区分音调,例如认为'a' != 'á'

_ci

不区分大小写,例如认为'a' = 'A'

_cs

区分大小写,例如认为'a' != 'A'

_ks

区分平假名、片假名,日语使用

_bin

二进制编码对比