在现代 Web 应用程序世界中,支撑多种语言和字符集变得越来越重要。跟着全球化的兴起,存储和处理多语言数据的需求变得至关重要。MySQL 作为最盛行的联系数据库办理系统之一,认识到了这一需求,并在其 8.0 版别中引入了 utf8mb4。在这篇文章中,咱们将通过实践示例讨论 utf8mb4 及其在 MySQL 8 中的优势。

MySQL 8 中 utf8mb4 的强壮:开释多语言数据的潜力

作者:Arunjith Aravindan

本文原文:www.percona.com/blog/the-po…

本文约 2000 字,预计阅读需求 7 分钟。

了解 utf8mb4

在深入讨论 utf8mb4 的优点之前,咱们先弄清一下 utf8mb4 代表什么。在 MySQL 中,“utf8”是指支撑 Unicode 字符集的字符编码,每个字符最多运用三个字节。可是,MySQL 中原始的 utf8 完成并没有包括一切 Unicode 字符。另一方面,utf8mb4 是 utf8 的修改版别,它支撑完好的 Unicode 字符集,包括表情符号和其他弥补字符,每个字符最多运用四个字节。

MySQL 中原始的 utf8 完成仅支撑根本多文种平面(BMP)中的字符,大约占一切 Unicode 字符的 90%。另一方面,utf8mb4 支撑整个 Unicode 字符集,包括表情符号和其他弥补字符。它通过每个字符最多运用四个字节而不是 utf8 运用的三个字节来完成此目的。

下表显示了 utf8 和 utf8mb4 之间的差异:

特征 UTF8 utf8mb3 utf8mb4
每个字符的最大字节数 3 3 4
支撑的字符 根本多文种平面 (BMP) BMP BMP 辅佐平面
MySQL 默许 Yes Yes Yes(MySQL 8.0 开始)
状况 已弃用 已弃用 未弃用

注意:历史上,MySQL 运用字符集 utf8 作为 utf8mb3 的别名。可是,从 MySQL 8.0.28 开始,utf8mb3 仅在 SHOW 句子的输出和信息架构表中引证该字符集时运用。未来,utf8 有望成为 utf8mb4 的参阅。为了避免任何歧义,主张在引证该字符集时显式指定 utf8mb4。

如您所见,utf8、utf8mb3 和 utf8mb4 之间的主要差异在于每个字符的最大字节数。 utf8 和 utf8mb3 只能存储 BMP 中的字符,而 utf8mb4 还能够存储弥补平面(Supplementary Plane)中的字符。这意味着 utf8mb4 能够支撑更广泛的字符,包括表情符号、数学符号和其他特别字符。

这三个字符集之间的另一个差异是它们在 MySQL 中的默许状况。utf8 是 MySQL 5.7 及更早版别中的默许字符集,而 utf8mb3 是 MySQL 8.0 中的默许字符集。可是,utf8mb4 是 MySQL 8.0.28 及更高版别中的默许字符集。

终究,MySQL 8.0 中已弃用 utf8 和 utf8mb3。这意味着它们终究将从 MySQL 中删除,因而主张运用 utf8mb4 代替。

因而,如果您需求存储一切 Unicode 字符,包括表情符号和其他弥补字符,那么您应该运用 utf8mb4。可是,如果您只需求存储 BMP 中的字符,那么 utf8 可能就足够了。

以下是运用 MySQL 表和查询对 utf8 和 utf8mb4 进行比较的示例:

比照示例

MySQL 5.7

mysql> select version();
 ----------- 
| version() |
 ----------- 
| 5.7.42-46 |
 ----------- 

Table

mysql> CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) CHARACTER SET utf8,
  email VARCHAR(255) CHARACTER SET utf8
);
Query OK, 0 rows affected (0.03 sec)
mysql> show create table usersG
*************************** 1. row ***************************
       Table: users
Create Table: CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `email` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.01 sec)

在用户表中刺进三行数据,包括 emoji 表情符号。

mysql> INSERT INTO users (name, email) VALUES
('Arun Jith', 'arunjith@example.com'),
('Jane Doe', 'janedoe@example.com'),
('', 'emoji@example.com');
ERROR 1366 (HY000): Incorrect string value: 'xF0x9Dx8Cx86' for column 'name' at row 3
mysql>

遇到的过错音讯 ERROR 1366 (HY000): Incorrect string value: ‘xF0x9Dx8Cx86’ for column ‘name’ at row 3, 第 3 行的 name 字段的字符编码存在问题。用户表测验将 Unicode 字符 刺进 name 字段时产生过错。

mysql> INSERT INTO users (name, email) VALUES
('Arun Jith', 'arunjith@example.com'),
('Jane Doe', 'janedoe@example.com')
;
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

MySQL 8.0

mysql> select version();
 ------------------------- 
| version()               |
 ------------------------- 
| 8.0.33-0ubuntu0.22.04.2 |
 ------------------------- 

Table

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) CHARACTER SET utf8,
  email VARCHAR(255) CHARACTER SET utf8
);
mysql> show create table usersG
*************************** 1. row ***************************
       Table: users
Create Table: CREATE TABLE `users` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
  `email` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

该表的 nameemail 字段均运用 utf8mb3 字符集。这意味着该表能够存储 BMP 中的一切字符,但不能存储表情符号或其他弥补字符。

Query

INSERT INTO users (name, email) VALUES
('Arun Jith', 'arunjith@example.com'),
('Jane Doe', 'janedoe@example.com'),
('', 'emoji@example.com');

与前面的示例一样的过错( ERROR 1366 (HY000): Incorrect string value: ‘xF0x9Dx8Cx86’ for column ‘name’ at row 3, )。

mysql> INSERT INTO users (name, email) VALUES
    -> ('Arun Jith', 'arunjith@example.com'),
    -> ('Jane Doe', 'janedoe@example.com'),
    -> ('', 'emoji@example.com');
ERROR 1366 (HY000): Incorrect string value: 'xF0x9Dx8Cx86' for column 'name' at row 3
mysql> INSERT INTO users (name, email) VALUES
    -> ('Arun Jith', 'arunjith@example.com'),
    -> ('Jane Doe', 'janedoe@example.com')
    -> ;
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

此查询将前两行数据刺进用户表中。前两行包括简单的文本数据,而第三行包括emoji 表情符号。表情符号将无法正确存储在数据库中,由于 utf8 字符集无法存储 emoji 表情符号。

Output

mysql> SELECT * FROM users;
 ---- ----------- ---------------------- 
| id | name      | email                |
 ---- ----------- ---------------------- 
|  4 | Arun Jith | arunjith@example.com |
|  5 | Jane Doe  | janedoe@example.com  |
 ---- ----------- ---------------------- 
2 rows in set (0.00 sec)

此查询将从用户表中选择两行。查询的输出将是用户表中一切行的列表,包括每个用户的 IDnameemail。第三行有表情符号的无法存储,刺进时犯错,由于 utf8 字符集无法存储表情符号。

Table

为了保证正确存储表情符号,让咱们运用 utf8mb4 字符集创立表列。之后,咱们能够持续检查表情符号刺进是否正确。

mysql> CREATE TABLE users (
    ->   id INT AUTO_INCREMENT PRIMARY KEY,
    ->   name VARCHAR(255) CHARACTER SET utf8mb4,
    ->   email VARCHAR(255) CHARACTER SET utf8mb4
    -> );
Query OK, 0 rows affected (0.03 sec)
mysql> show create table usersG
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

Query

INSERT INTO users (name, email) VALUES
('Arun Jith', 'arunjith@example.com'),
('Jane Doe', 'janedoe@example.com'),
('', 'emoji@example.com');
mysql> INSERT INTO users (name, email) VALUES
    -> ('Arun Jith', 'arunjith@example.com'),
    -> ('Jane Doe', 'janedoe@example.com'),
    -> ('', 'emoji@example.com');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

该表对 nameemail 列均运用 utf8mb4 字符集。这意味着该表能够存储完好 Unicode 字符会集的一切字符,包括 emoji 表情符号和其他弥补字符。

此查询将三行数据刺进用户表中。前两行包括简单的文本数据,而第三行包括表情符号。表情符号将正确存储在数据库中,由于 utf8mb4 字符集能够存储表情符号。

Output

mysql> SELECT * FROM users;
 ---- ----------- ---------------------- 
| id | name      | email                |
 ---- ----------- ---------------------- 
|  1 | Arun Jith | arunjith@example.com |
|  2 | Jane Doe  | janedoe@example.com  |
|  3 |          | emoji@example.com    |
 ---- ---------- ----------------------- 
3 rows in set (0.00 sec)

此查询将从用户表中选择一切行。查询的输出将是用户表中一切行的列表,包括每个用户的 IDnameemail。表情符号将被存储为表情符号,由于 utf8mb4 字符集能够存储表情符号。

总结

如您所见,utf8mb4 字符集能够存储完好 Unicode 字符会集的一切字符,包括表情符号和其他弥补字符。这使得它成为存储杂乱文本数据、文本搜索和比较的不错选择。另一方面,utf8 字符集只能存储 BMP 中的字符。这意味着它无法存储表情符号或其他弥补字符。

一般来说,主张一切新应用程序都运用 utf8mb4。这将保证您的数据能够正确存储和处理,不管它包括什么字符。

更多技术文章,请拜访:opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量办理平台,掩盖开发至生产环境的 SQL 审核和办理。支撑干流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线功率,进步数据质量。