【MySQL】字符集与排序规则

在MySQL数据库中,字符集(Character Set)和排序规则(Collation,也称字符集校验规则)是重要的概念,它们对于正确存储和比较数据至关重要。

字符集与排序规则

字符集是一组字符的集合,与数字编码之间建立了对应关系。它定义了数据库中可以存储的字符种类和范围。常见的字符集有UTF-8、Latin1、GBK等。字符集决定了数据库可以处理的语言和字符的能力。

排序规则定义了字符在排序和比较操作中的顺序。它决定了字符串排序的方式,包括字母的大小写敏感性、特殊字符的处理等。排序规则也叫字符集校对规则

每个字符集可以有多个排序规则。即排序规则是和字符集结合使用的,二者配合规定了数据库对字符串的存储范围、排序方式、大小写美感性、特殊字符的处理等。

MySQL支持的字符集

MySQL 提供了 SQL 用于查看数据库支持的字符集。
MySQL 环境如下图所示:
【MySQL】字符集与排序规则_第1张图片
执行 show charset; 查看该数据库支持的字符集。

mysql> show charset;
+----------+---------------------------------+---------------------+--------+
| 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.04 sec)

mysql> 

其中
Charset 指字符集名称;
Description 指字符集描述;
Default collation 指该字符集默认排序规则;
Maxlen 指该字符集存储字符的单位大小,一般情况下,该值越大,其可存储的字符范围越大

使用 SQL 语句也能查到以上字符集结果,语句如下:

select * from information_schema.character_sets order by character_set_name ;

编码集特性示例

编码集 特性
ascii 共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符,所以可以使用1个字节来进行编码
latin1 共收录256个字符,是在ASCII字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母),也可以使用1个字节来进行编码。
gb2312 收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个,其他文字符号682个,兼容ASCII字符集。这是一个变长字符集,如果该字符在ascii字符集中,则采用1字节编码,否则采用两字节。
gbk GBK是在gb2312基础上扩容后的标准。收录了所有的中文字符。同样的,这是一个变长字符集,如果该字符在ascii字符集中,则采用1字节编码,否则采用两字节。
utf8和utf8mb4 收录地球上能想到的所有字符,而且还在不断扩充。这种字符集兼容ASCII字符集,采用变长编码方式,编码一个字符需要使用1~4个字节。MySQL为了节省空间,其中的utf8是标准 UTF8 阉割后的,只有1~3字节编码的字符集,基本包含了所有常用的字符。如果还要使用 enoji 表情,那么需要使用utf8mb4,这个是完整的 UTF8 字符集。
utf16 不同于utf8,utf16用两个字节或者四个字节编码字符,可以理解为utf8的不节省空间的一种形式
utf32 固定用四个字节编码字符,可以理解为utf8的不节省空间的一种形式

支持的排序规则

使用命令 show collation; 可以查看数据库支持的所有排序规则,由于太多,以下以查看 gb2312 字符集所属的排序规则。

mysql> show collation where Charset='gb2312';
+-------------------+---------+----+---------+----------+---------+---------------+
| Collation         | Charset | Id | Default | Compiled | Sortlen | Pad_attribute |
+-------------------+---------+----+---------+----------+---------+---------------+
| gb2312_bin        | gb2312  | 86 |         | Yes      |       1 | PAD SPACE     |
| gb2312_chinese_ci | gb2312  | 24 | Yes     | Yes      |       1 | PAD SPACE     |
+-------------------+---------+----+---------+----------+---------+---------------+

其中各字段含义如下

  • Collation :排序规则名
  • Charset :所属字符集
  • Id : 每个字符集校对规则的唯一标识符
  • Default : 是否是默认排序规则,YES 表示是所属字符集的默认排序规则
  • Compiled :如果某个字符集校对规则已编译,则该列的值为 Yes,否则为 No。
  • Sortlen :用于排序的最大字符数。
  • Pad_attribute :指示是否在比较字符串时使用填充。

使用如下SQL语句也能查到如上信息,

mysql> select * from information_schema.collations where character_set_name = "gb2312" order by collation_name;
+-------------------+--------------------+----+------------+-------------+---------+---------------+
| COLLATION_NAME    | CHARACTER_SET_NAME | ID | IS_DEFAULT | IS_COMPILED | SORTLEN | PAD_ATTRIBUTE |
+-------------------+--------------------+----+------------+-------------+---------+---------------+
| gb2312_bin        | gb2312             | 86 |            | Yes         |       1 | PAD SPACE     |
| gb2312_chinese_ci | gb2312             | 24 | Yes        | Yes         |       1 | PAD SPACE     |
+-------------------+--------------------+----+------------+-------------+---------+---------------+
2 rows in set (0.00 sec)

mysql> 

排序规则命名特点

排序规则(字符集校验规则)名称命名有一定的规律。

  • 排序规则名称以与其关联的字符集的名称开头,可以用通过这个开头查询所有的字符集,也可以查询 information_schema.collations 精确指定字符集
  • 字符集后面跟着的是语言编码,因为utf8mb4包含了所有字符,不同国家的文字语言排序肯定不一样。
  • 最后末尾的ci代表case insensitive,大小写不敏感,所有可能的后缀如下所示:
符号 含义
ai accent insensitive 不区分重音
as accent sensitive 区分重音
ci case insensitive 不区分大小写
cs case sensitive 区分大小写
bin binary 以二进制方式比较

例如,在字符序“utf8_general_ci”下,字符“a”和“A”是等价的;在字符序“utf8_general_cs”下,字符“a”和“A”是不等价的;在字符序“utf8_bin”下,直接比较字符编码,可以区分大小写,因为字符集的“A”和“a”的编码显然不同。

总结

尽管MySQL 支持众多字符集与排序规则,在使用 MySQL 时,确保数据库、表和列的字符集设置一致,以避免潜在的字符转换问题。

你可能感兴趣的:(数据库,mysql,数据库)