字符集
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。