关于mysql:聊一聊MySQL的字符集

40次阅读

共计 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

正文完
 0