共计 3346 个字符,预计需要花费 9 分钟才能阅读完成。
一、字符集概述
字符集(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