一、字符集概述
字符集(Character Set)是多个字符的汇合,字符集品种较多,每个字符集蕴含的字符个数不同,常见字符集名称:ASCII、GB2312、BIG5、Unicode等。
UTF(Unicode Tranformation Format)是Unicode的其中一个应用形式,即把Unicode转做某种格局的意思,包含UTF-8,UTF-16,UTF-32。
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。
UTF-8用1到6个字节编码Unicode字符。用在网页上能够同一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。
UTF-16应用一个或两个未调配的16位代码单元的序列对Unicode代码点进行编码。
UTF-32行将每一个Unicode代码点示意为雷同值的32位整数。
上面是UTF-8的编码方式:
一个字节:0xxxxxxx
二、MySQL的字符集
MySQL的字符集包含字符集(charset)和校对规定(collation)两个概念。
字符集定义了存储字符串的形式,校对规定定义了比拟字符串的形式。
MySQL8.0反对40多种字符集的270多种校对规定。
能够应用以下指令,来查看MySQL零碎反对的字符集和校对规定。如下:
mysql> show charset;
MySQL8.0之前创立表不指定字符集的话,默认采纳latin1字符集,MySQL8.0之后版本才改为默认utf8mb4(most bytes 4)字符集,昆仑数据库存储节点采纳的是MySQL8.0架构,当然也是默认utf8mb4。
UTF-8,在MySQL中写作utf8,真的有所不同。
MySQL从4.1版本开始反对utf8。可能过后的utf8还没有定义4-6个字节规范,或者MySQL设计者认为1-3个字节的utf8曾经够用了。
所以过后MySQL设计的utf8只反对1-3个字节的编码,不是残缺的utf8,这种编码方式始终保留至今。
尽管在MySQL在5.5.3之后减少了utf8mb4字符集,但一段时间开发人员都习惯采纳utf8等字符集来反对中文。
MySQL的utf8会导致一些4个字节编码的生僻汉字插入谬误。
还有当初APP端的emoji表情是4个字节的字符,如果不转码,间接更新到数据库也会报出异样。
历史起因导致MySQL的utf8常常让人误会,已经让很多开发人员吃了苦头,网上有些文章比方:“永远不要在MySQL中应用utf8”,看着都挺吓人。
当然过个几年4个字节的utf8mb4编码可能又不够用了,那MySQL又要减少utf8mb5、utf8mb6。
字符除了须要存储,还须要排序或比拟大小,波及与字符集绝对应的校对规定。在MySQL8.0中查看一下utf8mb4对应的校对规定:
mysql> show collationlike 'utf8mb4%';+----------------------------+---------+-----+---------+| Collation | Charset | Id | Default |+----------------------------+---------+-----+---------+|utf8mb4_0900_ai_ci | utf8mb4 |255 | Yes ||utf8mb4_0900_as_ci | utf8mb4 |305 | ||utf8mb4_0900_as_cs | utf8mb4 |278 | ||utf8mb4_0900_bin | utf8mb4 |309 | || utf8mb4_bin | utf8mb4 | 46 | || ................... | | | |75 rows in set (0.00sec)
utf8mb4的校对规定默认utf8mb4_0900_ai_ci。其中0900示意Unicode版本9.0.0,后缀含意如下表:
+-------------+----------------------+-----------------+| 后缀 | 英文 | 形容 |+-------------+----------------------+-----------------+| _ai | accent insensitive | 不辨别重音 || _as | accent sensitive | 辨别重音 || _ci | case insensitive | 不辨别大小写 || _cs | case sensitive | 辨别大小写 || _bin | binary | 二进制比拟 |+-------------+----------------------+-----------------+
三、举例来解释一下MySQL的utf8字符集
创立两张表,别离为utf8和utf8mb4字符集:
CREATE TABLE tb_utf8( `id` INT AUTO_INCREMENT, `info` VARCHAR(8), PRIMARY KEY (`id`))CHARSET=utf8;CREATE TABLE tb_utf8mb4( `id` INT AUTO_INCREMENT, `info` VARCHAR(8), PRIMARY KEY (`id`)); #默认采纳utf8mb4
插入数据:
insert into tb_utf8(info) values("昆仑数据库");insert into tb_utf8(info) values("昆仑数据库A12");insert into tb_utf8(info) values("昆仑数据库A123");#超过8个字符失败了
查看一下表格数据,以及占用空间:
mysql> selectinfo,length(info) from tb_utf8;+--------------------+--------------+| info | length(info) |+--------------------+--------------+| 昆仑数据库 | 15 || 昆仑数据库A12 | 18 |+--------------------+--------------+2 rows in set (0.00sec)
能够看出utf8字符集中,个别的汉字占用3个字节,英文和数字占1个字节。
接下来试下4个字节的emoji表情包:
插入4个字节的emoji表情包失败了。
因为大部分SSH工具不反对4字节的UTF-8字符显示,笔者是间接在Ubuntu20零碎的Terminal做的演示。4字节的生僻汉字临时找不到反对的终端界面,这里就不演示了。
咱们在反对4个字节的utf8mb4表格中插入emoji表情包,并查看一下数据,以及占用空间:
最初咱们来看看校验规定,在tb_utf8mb4中插入一些数据:
insert into tb_utf8mb4(info) values("ABC");insert into tb_utf8mb4(info) values("Abc");insert into tb_utf8mb4(info) values("abc");
查看一下数据,三个记录都进去了:
mysql> select info from tb_utf8mb4 where info="abc";+------+| info |+------+| ABC || Abc || abc |+------+3 rows in set (0.00 sec)
这种校对规定,对于网址,邮箱地址等不辨别大小写的场景非常好用,但如果咱们须要辨别大小写,能够批改一下校对规定:
alter table tb_utf8mb4 modify info varchar(8) collate utf8mb4_0900_as_cs;
再查看一下数据,这回只有一条记录满足:
mysql> select info from tb_utf8mb4 where info="abc";+------+| info |+------+| abc |+------+1 row in set (0.00 sec)
MySQL的字符集就聊到这里,科普一下数据库的基础知识。
KunlunDB我的项目已开源
【GitHub:】
https://github.com/zettadb
【Gitee:】
https://gitee.com/zettadb
END