A. Cedano Asked: 2020-04-28 08:27:17 +0800 CST 2020-04-28 08:27:17 +0800 CST 2020-04-28 08:27:17 +0800 CST MySQL中的utf8mb4和utf8,有什么区别? 772 自上次 PHPMyAdmin 更新以来,我看到现在默认字符集是utf8mb4. 我想知道utf8 的这种变体(如果我们可以这样称呼它)存在的具体原因utf8mb4,utf8以及是否有任何具体原因。 另外,如果我决定将表和列的字符集更改为utf8mb4我想知道是否有问题。 mysql 2 Answers Voted Best Answer Ventur 2020-04-28T09:55:07+08:002020-04-28T09:55:07+08:00 美好的一天,正如文档所述,自 MySQL 5.5.3 版以来,添加了这个 utf 的“变体”。现在有什么区别? UTF-8 UTF-8 编码可以表示Unicode 字符集中的每个符号,范围从U+000,000 到U+10FFFF。那是 1,114,112 个可能的符号。(并非所有这些 Unicode 代码点都被分配了字符,但这并不妨碍 UTF-8 能够对它们进行编码。) 很多时候,我们将 MySQL 的 utf8charset 用于数据库、表和列,假设它映射到上述 UTF-8 编码。通过使用 utf8,假设几乎可以存储任何符号。 例子: CREATE TABLE ForgeRock (`id` int, `productName` varchar(7), `description` varchar(55)) ; INSERT INTO ForgeRock (`id`, `productName`, `description`) VALUES (1, 'OpenIDM', 'Platform for building enterprise provisioning solutions'), (2, 'OpenAM', 'Full-featured access management'), (3, 'OpenDJ', 'Robust LDAP server for Java') ; SET NAMES utf8; 查询正常,0 行受影响(0.00 秒) UPDATE ForgeRock SET description = 'foo?bar' WHERE id = 3; 现在看warings: SHOW WARNINGS\G +---------+------+------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+------------------------------------------------------------------------------+ | Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'description' at row 1 | +---------+------+------------------------------------------------------------------------------+ 1 row in set (0.00 sec) 事实证明,MySQL utf8charset 仅部分实现了正确的 UTF-8 编码。由 UTF-8 编码的一到三个字节组成的符号;不支持占用四个字节的编码符号。 这不仅会影响 ? 字符,还会影响更重要的符号,例如 U+01F4A9 (?)。总共有 1,048,575 个可能的代码点,它不能被使用。事实上,MySQL 的 utf8 只允许存储所有可能的 Unicode 代码点的 5.88% ( (0x00FFFF + 1) / (0x10FFFF + 1))。正确的 UTF-8 可以编码 100% 的所有 Unicode 代码点。 现在,如果您想更改表或数据库中的编码,因为 utf8mb4 与 utf8 完全兼容,那么在将某些内容移动到它之前,请创建您的信息备份。 cnbandicoot 2020-04-28T08:38:30+08:002020-04-28T08:38:30+08:00 作为文档评论: utf8每个字符最多使用三个字节,并且仅包含 BMP 字符。相反,它utf8mb4每个字符最多使用 4 个字节,支持补充字符。 提示:为了节省空间用utf8mb4useVARCHAR而不是CHAR.
美好的一天,正如文档所述,自 MySQL 5.5.3 版以来,添加了这个 utf 的“变体”。现在有什么区别?
UTF-8 UTF-8 编码可以表示Unicode 字符集中的每个符号,范围从U+000,000 到U+10FFFF。那是 1,114,112 个可能的符号。(并非所有这些 Unicode 代码点都被分配了字符,但这并不妨碍 UTF-8 能够对它们进行编码。)
很多时候,我们将 MySQL 的 utf8charset 用于数据库、表和列,假设它映射到上述 UTF-8 编码。通过使用 utf8,假设几乎可以存储任何符号。
例子:
现在看warings:
事实证明,MySQL utf8charset 仅部分实现了正确的 UTF-8 编码。由 UTF-8 编码的一到三个字节组成的符号;不支持占用四个字节的编码符号。
这不仅会影响 ? 字符,还会影响更重要的符号,例如 U+01F4A9 (?)。总共有 1,048,575 个可能的代码点,它不能被使用。事实上,MySQL 的 utf8 只允许存储所有可能的 Unicode 代码点的 5.88% ( (0x00FFFF + 1) / (0x10FFFF + 1))。正确的 UTF-8 可以编码 100% 的所有 Unicode 代码点。
现在,如果您想更改表或数据库中的编码,因为 utf8mb4 与 utf8 完全兼容,那么在将某些内容移动到它之前,请创建您的信息备份。
作为文档评论: