在世界现代web应用程序中,它是越来越重要的支持各种各样的语言和字符集。随着全球化的兴起,需要存储和处理多语言数据已成为必不可少的。MySQL,其中最流行的关系数据库管理系统,意识到这种需求,介绍了utf8mb4 8.0版本的改变。在这篇文章中,我们将探索utf8mb4和它的优点在MySQL 8.0中,实例的支持。
理解utf8mb4
之前到的好处,让我们澄清utf8mb4代表什么。在MySQL utf8 "指的是一个支持Unicode字符集的字符编码使用每个角色最多三个字节。然而,原始utf8实现在MySQL中并不涵盖所有Unicode字符。utf8mb4,另一方面,是一个修改版的utf8,支持完整的Unicode字符集,包括emojis和其他补充字符,通过每个角色最多四个字节。
MySQL中的原始utf8实现只支持角色的基本语言使用者飞机(BMP),大约90%的Unicode字符。utf8mb4,另一方面,支持整个Unicode字符集,包括emojis和其他补充字符。它通过使用最多每四个字节字符而不是使用的三个字节utf8。
这是一个表显示的区别utf8和utf8mb4:
| 功能 | use utf8 | utf8mb3 | utf8mb4 |
| 最大的每个字符的字节数 | 3 | 3 | 4 |
| 人物的支持 | 基本语言平面(BMP) | 骨形态发生蛋白 | BMP +补充平面 |
| 在MySQL的默认 | 是的 | 是的 | 是的(因为MySQL 8.0) |
| 弃用状态 | 弃用 | 弃用 | 不弃用 |
请注意:从历史上看,MySQL使用字符集utf8作为utf8mb3别名。然而,从MySQL 8.0.28 utf8mb3只用于显示报表的输出和信息模式表指字符集。在未来,use utf8 utf8mb4有望成为一个参考。为了避免任何歧义,建议明确指定字符集utf8mb4指。
正如你所看到的,主要区别utf8, utf8mb3, utf8mb4每个字符的最大字节数。use utf8, utf8mb3只能存储字符的基本语言平面(BMP),而utf8mb4还可以存储字符的补充。这意味着utf8mb4可以支持更大范围的字符,包括emojis、数学符号和其他特殊字符。
三个字符集的另一个区别是他们的MySQL的默认状态。utf8是默认的字符集,MySQL 5.7和更早,虽然utf8mb3 MySQL 8.0中是默认的字符集。然而,utf8mb4 MySQL的默认字符集8.0.28后来。
最后,utf8 MySQL 8.0和utf8mb3弃用。这意味着他们最终会从MySQL,所以推荐使用utf8mb4代替。
所以,如果你需要存储所有的Unicode字符,包括emojis和其他补充字符,那么你应该使用utf8mb4。但是,如果你只需要存储字符从BMP,然后utf8可能就足够了。
这是一个例子的比较utf8, utf8mb4使用MySQL表和查询:
MySQL 5.7
|
1
2
3
4
5
6
|
mysql>
选择
版本();
+ - - - - - - - - - - - - +
|
版本()|
+ - - - - - - - - - - - - +
|5.7.42- - - - - -46|
+ - - - - - - - - - - - - +
|
表:
|
1
2
3
4
5
6
|
mysql>
创建
表
用户(
id
INT
AUTO_INCREMENT
主键,
的名字
VARCHAR(255)
字符集
use utf8,
电子邮件
VARCHAR(255)
字符集
use utf8
);
查询好吧,0
行
影响(0.03sec)
|
|
1
2
3
4
5
6
7
8
9
10
|
mysql>
显示
创建
表
usersG
* * * * * * * * * * * * * * * * * * * * * * * * * * *1。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
表:用户
创建
表:
创建
表
“用户”(
“id”
int(11)
非空
AUTO_INCREMENT,
“名字”
varchar(255)
字符集
use utf8
默认的
零,
“电子邮件”
varchar(255)
字符集
use utf8
默认的
零,
主键
(“id”)
)
引擎
=
InnoDB
默认的
字符集
=latin1
1
行
在
集
(0.01sec)
|
将三行插入用户表,包括emoji。
遇到的错误消息,“错误1366 (HY000):不正确的字符串值:“xF0x9Dx8Cx86”列在第三行“名称”,“表明,有一个问题所使用的字符编码为“名称”列在“用户”表中。错误发生在试图插入Unicode字符”到“名称”列。
MySQL 8.0
|
1
2
3
4
5
6
|
mysql>
选择
版本();
+ - - - - - - - - - - - - - - - - - - - - - - - - - +
|
版本()|
+ - - - - - - - - - - - - - - - - - - - - - - - - - +
|8.0.33- - - - - -0 ubuntu0.22.04.2|
+ - - - - - - - - - - - - - - - - - - - - - - - - - +
|
表:
|
1
2
3
4
5
|
创建
表
用户(
id
INT
AUTO_INCREMENT
主键,
的名字
VARCHAR(255)
字符集
use utf8,
电子邮件
VARCHAR(255)
字符集
use utf8
);
|
|
1
2
3
4
5
6
7
8
9
10
|
mysql>
显示
创建
表
usersG
* * * * * * * * * * * * * * * * * * * * * * * * * * *1。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
表:用户
创建
表:
创建
表
“用户”(
“id”
int
非空
AUTO_INCREMENT,
“名字”
varchar(255)
字符集
utf8mb3
核对
utf8mb3_general_ci
默认的
零,
“电子邮件”
varchar(255)
字符集
utf8mb3
核对
utf8mb3_general_ci
默认的
零,
主键
(“id”)
)
引擎
=
InnoDB
默认的
字符集
=utf8mb4
核对
=utf8mb4_0900_ai_ci
1
行
在
集
(0.00sec)
|
这个表使用的utf8mb3字符集的名字和电子邮件列。这意味着从BMP表可以存储所有字符,但它不能存储emojis或其他补充字符。
查询:
与前面的示例一样,错误消息你遇到,“错误1366 (HY000):不正确的字符串值:“xF0x9Dx8Cx86”列在第三行“名称”,“表明,有一个问题所使用的字符编码为“名称”列在“用户”表中。错误发生在试图插入Unicode字符”到“名称”列。
这个查询将前两行插入用户表。前两行包含简单的文本数据,而第三行包含一个emoji。emoji不会正确地存储在数据库,因为use utf8字符集emojis不能储存。
输出:
从用户选择*;
|
1
2
3
4
5
6
7
8
|
mysql>
选择
*
从
用户;
+ - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|id|的名字|电子邮件|
+ - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|4|阿伦Jith|
(电子邮件保护)
例子com|
|5|简美国能源部|
(电子邮件保护)
例子com|
+ - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2
行
在
集
(0.00sec)
|
这个查询将选择的两行用户表。查询的输出将是一个列表的所有行用户表,包括名称、电子邮件、和每个用户的ID。第三行emoji不能存储,和它错误而插入,因为use utf8字符集emojis不能储存。
表:
确保适当的存储emojis,让我们创建表列使用utf8mb4字符集。之后,我们可以继续检查emoji插入工作正常。
|
1
2
3
4
5
6
|
mysql>
创建
表
用户(
- - - - - ->
id
INT
AUTO_INCREMENT
主键,
- - - - - ->
的名字
VARCHAR(255)
字符集
utf8mb4,
- - - - - ->
电子邮件
VARCHAR(255)
字符集
utf8mb4
- - - - - ->
);
查询好吧,0
行
影响(0.03sec)
|
|
1
2
3
4
5
6
7
8
9
10
|
mysql>
显示
创建
表
usersG
* * * * * * * * * * * * * * * * * * * * * * * * * * *1。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
表:用户
创建
表:
创建
表
“用户”(
“id”
int
非空
AUTO_INCREMENT,
“名字”
varchar(255)
字符集
utf8mb4
核对
utf8mb4_0900_ai_ci
默认的
零,
“电子邮件”
varchar(255)
字符集
utf8mb4
核对
utf8mb4_0900_ai_ci
默认的
零,
主键
(“id”)
)
引擎
=
InnoDB
默认的
字符集
=utf8mb4
核对
=utf8mb4_0900_ai_ci
1
行
在
集
(0.00sec)
|
查询:
这个表使用utf8mb4字符集的的名字和电子邮件列。这意味着表可以存储所有字符的Unicode字符集,包括emojis和其他补充字符。
这个查询将三行插入用户表。前两行包含简单的文本数据,而第三行包含一个emoji。emoji将存储在数据库中正确,因为utf8mb4字符集可以存储emojis。
输出:
从用户选择*;
|
1
2
3
4
5
6
7
8
9
|
mysql>
选择
*
从
用户;
+ - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|id|的名字|电子邮件|
+ - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|1|阿伦Jith|
(电子邮件保护)
例子com|
|2|简美国能源部|
(电子邮件保护)
例子com|
|3||
(电子邮件保护)
例子com|
+ - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
3
行
在
集
(0.00sec)
|
这个查询将选择的所有行用户表。查询的输出将是一个列表的所有行用户表,包括名称、电子邮件、和每个用户的ID。emoji将存储作为emoji因为utf8mb4字符集可以存储emojis。
结论
如您所见,utf8mb4字符集可以存储所有字符的完整的Unicode字符集,包括emojis和其他补充字符。这是一个不错的选择对于存储复杂的文本数据,文本搜索和比较。utf8字符集,另一方面,只能存储字符从BMP。这意味着它不能存储emojis或其他补充字符。
一般而言,推荐使用utf8mb4所有新的应用程序。这将确保您的数据可以存储和处理正确,无论它包含的字符。
雷竞技下载官网Percona MySQL是最完整,分布稳定、可伸缩的、安全的MySQL开源解决方案,提供企业级的数据库环境最关键业务应用程序…和它的免费使用!




