MySQL 中的 utf8mb4 和 utf8 字符集有什么区别?
What is the difference between utf8mb4 and utf8 charsets in MySQL?
utf8mb4
和 utf8
字符集在 MySQL 中有什么区别?
我已经知道 ASCII、UTF-8、UTF-16 和 UTF-32 编码;
但我很想知道 utf8mb4
编码组与 MySQL Server.
中定义的其他编码类型有什么区别
使用utf8mb4
而不是utf8
有什么特别的benefits/proposes吗?
UTF-8是变长编码。在 UTF-8 的情况下,这意味着存储一个代码点需要一到四个字节。但是,MySQL 称为“utf8”(“utf8mb3”的别名)的编码每个代码点最多只能存储三个字节。
所以字符集“utf8”/“utf8mb3”不能存储所有的Unicode代码点:它只支持范围0x000到0xFFFF,称为“Basic Multilingual Plane”。
另见 Comparison of Unicode encodings。
这是(同一页面的先前版本)the MySQL documentation 不得不说的:
The character set named utf8[/utf8mb3] uses a maximum of three bytes per character and contains only BMP characters. As of MySQL 5.5.3, the utf8mb4 character set uses a maximum of four bytes per character supports supplemental characters:
For a BMP character, utf8[/utf8mb3] and utf8mb4 have identical storage characteristics: same code values, same encoding, same length.
For a supplementary character, utf8[/utf8mb3] cannot store the character at all, while utf8mb4 requires four bytes to store it. Since utf8[/utf8mb3] cannot store the character at all, you do not have any supplementary characters in utf8[/utf8mb3] columns and you need not worry about converting characters or losing data when upgrading utf8[/utf8mb3] data from older versions of MySQL.
因此,如果您希望您的列支持存储位于 BMP 之外的字符(并且您通常希望这样做),例如 emoji, use "utf8mb4". See also What are the most common non-BMP Unicode characters in actual use?。
utf8mb4
字符集很有用,因为现在我们不仅需要支持存储语言字符,还需要支持存储符号、新引入的表情符号等。
Mathias Bynens 对 How to support full Unicode in MySQL databases 的精彩阅读也可以对此有所启发。
取自 MySQL 8.0 Reference Manual:
utf8mb4
: A UTF-8 encoding of the Unicode character set using one to
four bytes per character.
utf8mb3
: A UTF-8 encoding of the Unicode character set using one to
three bytes per character.
在 MySQL utf8
当前是 utf8mb3
的别名, 已弃用 和将在以后的 MySQL 版本中删除。那时 utf8
将成为对 utf8mb4
.
的引用
所以不管这个别名,你可以有意识地给自己设置一个utf8mb4
编码。
为了完成答案,我想在下面添加 @WilliamEntriken 的 评论(也摘自手册):
To avoid ambiguity about the meaning of utf8
, consider specifying utf8mb4
explicitly for character set references instead of utf8
.
MySQL在5.5.3之后加入了这个utf8mb4编码,Mb4是最多字节4的意思,专门为了兼容四字节的Unicode而设计的。幸运的是,UTF8MB4 是 UTF8 的超集,只是不需要将编码转换为 UTF8MB4。当然为了省事space,一般用UTF8就够了
原始的UTF-8格式使用一到六个字节,最多可以编码31个字符。最新的 UTF-8 规范仅使用一到四个字节,最多可以编码 21 位,正好可以表示所有 17 个 Unicode 平面。 UTF8是Mysql中的一个字符集,最多只支持三个字节的UTF-8字符,是Unicode中的基本多文本平面。
要在Mysql中保存4个字节长的UTF-8字符,需要使用UTF8MB4字符集,但只有5.5。支持后3个版本(查看版本:Select版本();)。我认为为了获得更好的兼容性,您应该始终使用 UTF8MB4 而不是 UTF8。对于char类型数据,UTF8MB4消耗较多space,根据Mysql官方推荐,使用VARCHAR代替char。
MariaDB utf8mb4 在服务器配置中未明确设置时作为默认字符集,因此使用 COLLATE utf8mb4_unicode_ci。
Refer MariaDB CHARSET & COLLATE Click
CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
utf8
是 MySQL 较旧的、有缺陷的 UTF-8 实现,正在被弃用。
utf8mb4
是他们命名的固定 UTF-8 实现,也是您现在应该使用的。
在他们有缺陷的版本中,只有前 64k 字符平面中的字符 - 基本多语言平面 - 有效,其他字符被视为无效。该平面内的代码点值 - 0 到 65535(其中一些因特殊原因保留)可以用最多 3 个字节的 UTF-8 中的 multi-byte 编码表示,并且 MySQL 的早期UTF-8 版本任意决定将其设置为限制。这个限制在任何时候都不是对 UTF-8 规则的正确 解释,因为 UTF-8 从来没有被定义为每个字符最多只允许 3 个字节。事实上,UTF-8 的最早定义将其定义为最多 6 个字节(后来修改为 4 个)。 MySQL的原版总是被任意废掉
当 MySQL 发布此功能时,此限制的后果并不算太糟糕,因为大多数 Unicode 字符都在第一个平面中。从那时起,越来越多新定义的字符范围被添加到 Unicode 中,其值在第一个平面之外。 Unicode 本身定义了 17 个平面,尽管到目前为止只使用了其中的 7 个。
为了不破坏任何特定假设的旧代码,MySQL 保留了损坏的实现并调用更新的固定版本 utf8mb4
。这导致一些混淆,名称被误解为好像它是 UTF-8 的某种扩展或 UTF-8 的替代形式,而不是 MySQL 对真正的 UTF-8 的实现。
MySQL 的未来版本最终将逐步淘汰旧版本,现在可以将其视为已弃用。在可预见的将来,您需要使用 utf8mb4
来确保正确的 UTF-8 编码。经过足够的时间后,当前的 utf8
将被删除,并且在未来的某个日期 utf8
将再次上升,这次指的是固定版本,尽管 utf8mb4
将继续明确指代到固定版本。
utf8mb4
和 utf8
字符集在 MySQL 中有什么区别?
我已经知道 ASCII、UTF-8、UTF-16 和 UTF-32 编码;
但我很想知道 utf8mb4
编码组与 MySQL Server.
使用utf8mb4
而不是utf8
有什么特别的benefits/proposes吗?
UTF-8是变长编码。在 UTF-8 的情况下,这意味着存储一个代码点需要一到四个字节。但是,MySQL 称为“utf8”(“utf8mb3”的别名)的编码每个代码点最多只能存储三个字节。
所以字符集“utf8”/“utf8mb3”不能存储所有的Unicode代码点:它只支持范围0x000到0xFFFF,称为“Basic Multilingual Plane”。 另见 Comparison of Unicode encodings。
这是(同一页面的先前版本)the MySQL documentation 不得不说的:
The character set named utf8[/utf8mb3] uses a maximum of three bytes per character and contains only BMP characters. As of MySQL 5.5.3, the utf8mb4 character set uses a maximum of four bytes per character supports supplemental characters:
For a BMP character, utf8[/utf8mb3] and utf8mb4 have identical storage characteristics: same code values, same encoding, same length.
For a supplementary character, utf8[/utf8mb3] cannot store the character at all, while utf8mb4 requires four bytes to store it. Since utf8[/utf8mb3] cannot store the character at all, you do not have any supplementary characters in utf8[/utf8mb3] columns and you need not worry about converting characters or losing data when upgrading utf8[/utf8mb3] data from older versions of MySQL.
因此,如果您希望您的列支持存储位于 BMP 之外的字符(并且您通常希望这样做),例如 emoji, use "utf8mb4". See also What are the most common non-BMP Unicode characters in actual use?。
utf8mb4
字符集很有用,因为现在我们不仅需要支持存储语言字符,还需要支持存储符号、新引入的表情符号等。
Mathias Bynens 对 How to support full Unicode in MySQL databases 的精彩阅读也可以对此有所启发。
取自 MySQL 8.0 Reference Manual:
utf8mb4
: A UTF-8 encoding of the Unicode character set using one to four bytes per character.
utf8mb3
: A UTF-8 encoding of the Unicode character set using one to three bytes per character.
在 MySQL utf8
当前是 utf8mb3
的别名, 已弃用 和将在以后的 MySQL 版本中删除。那时 utf8
将成为对 utf8mb4
.
所以不管这个别名,你可以有意识地给自己设置一个utf8mb4
编码。
为了完成答案,我想在下面添加 @WilliamEntriken 的 评论(也摘自手册):
To avoid ambiguity about the meaning of
utf8
, consider specifyingutf8mb4
explicitly for character set references instead ofutf8
.
MySQL在5.5.3之后加入了这个utf8mb4编码,Mb4是最多字节4的意思,专门为了兼容四字节的Unicode而设计的。幸运的是,UTF8MB4 是 UTF8 的超集,只是不需要将编码转换为 UTF8MB4。当然为了省事space,一般用UTF8就够了
原始的UTF-8格式使用一到六个字节,最多可以编码31个字符。最新的 UTF-8 规范仅使用一到四个字节,最多可以编码 21 位,正好可以表示所有 17 个 Unicode 平面。 UTF8是Mysql中的一个字符集,最多只支持三个字节的UTF-8字符,是Unicode中的基本多文本平面。
要在Mysql中保存4个字节长的UTF-8字符,需要使用UTF8MB4字符集,但只有5.5。支持后3个版本(查看版本:Select版本();)。我认为为了获得更好的兼容性,您应该始终使用 UTF8MB4 而不是 UTF8。对于char类型数据,UTF8MB4消耗较多space,根据Mysql官方推荐,使用VARCHAR代替char。
MariaDB utf8mb4 在服务器配置中未明确设置时作为默认字符集,因此使用 COLLATE utf8mb4_unicode_ci。
Refer MariaDB CHARSET & COLLATE Click
CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
utf8
是 MySQL 较旧的、有缺陷的 UTF-8 实现,正在被弃用。utf8mb4
是他们命名的固定 UTF-8 实现,也是您现在应该使用的。
在他们有缺陷的版本中,只有前 64k 字符平面中的字符 - 基本多语言平面 - 有效,其他字符被视为无效。该平面内的代码点值 - 0 到 65535(其中一些因特殊原因保留)可以用最多 3 个字节的 UTF-8 中的 multi-byte 编码表示,并且 MySQL 的早期UTF-8 版本任意决定将其设置为限制。这个限制在任何时候都不是对 UTF-8 规则的正确 解释,因为 UTF-8 从来没有被定义为每个字符最多只允许 3 个字节。事实上,UTF-8 的最早定义将其定义为最多 6 个字节(后来修改为 4 个)。 MySQL的原版总是被任意废掉
当 MySQL 发布此功能时,此限制的后果并不算太糟糕,因为大多数 Unicode 字符都在第一个平面中。从那时起,越来越多新定义的字符范围被添加到 Unicode 中,其值在第一个平面之外。 Unicode 本身定义了 17 个平面,尽管到目前为止只使用了其中的 7 个。
为了不破坏任何特定假设的旧代码,MySQL 保留了损坏的实现并调用更新的固定版本 utf8mb4
。这导致一些混淆,名称被误解为好像它是 UTF-8 的某种扩展或 UTF-8 的替代形式,而不是 MySQL 对真正的 UTF-8 的实现。
MySQL 的未来版本最终将逐步淘汰旧版本,现在可以将其视为已弃用。在可预见的将来,您需要使用 utf8mb4
来确保正确的 UTF-8 编码。经过足够的时间后,当前的 utf8
将被删除,并且在未来的某个日期 utf8
将再次上升,这次指的是固定版本,尽管 utf8mb4
将继续明确指代到固定版本。