MySQL字符集utf8和utf8mb4区别及排序规则

字符集

UTF8是针对Unicode的一种可变长度字符编码,它表示一个字符需要使用1~4个字节。

在mysql中,utf8默认指的是utf8mb3,即使用1-3个字节表示一个字符;正常来说utf8也就是最大使用3个字节的utf8mb3已经够用了,但是为了存储4个字节场景下的字符如emoji表情,就需要用到4个字节编码的utf8,也就是utf8mb4。其中mb4的含义为:most bytes 4,也就是最大4字节。

查看mysql支持的字符集可以使用这个命令查看:

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

其中最后一列Maxlen就是表示该字符集最大使用多少个字节。

排序规则

我们可以看到还有一列叫Default collation,这一列代表当前字符集默认的一个排序规则是什么。

解释一下什么叫排序规则,排序规则就是指2个字符如何进行一个排序的规则,也就是比大小。

比如我们当前有一个表,且插入一些数据:

drop table if exists `t`;
CREATE TABLE `t` (
  `str` varchar(32) NOT NULL DEFAULT '' COMMENT '字符'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='demo表';
insert into `t` values('a'),('A'),('b'),('B'),('我');

此时使用的排序规则为utf8mb4_general_ci 其中ci为忽略大小写的含义,则排序规则为:

select * from `t` order by str asc;
a
A
b
B
我

删除表数据重新建表,这次使用的排序规则为utf8mb4_bin(根据二进制编码来排序)

drop table if exists `t`;
CREATE TABLE `t` (
  `str` varchar(32) NOT NULL DEFAULT '' COMMENT '字符'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='demo表';
insert into `t` values('a'),('A'),('b'),('B'),('我');

重新查询

select * from `t` order by str asc;
A
B
a
b
我

可以看到排序的结果不一样,这就是排序规则不同导致的原因。正常来说,除非有特殊要求,否则使用默认的即可,也就是utf8mb4_general_ci。


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍