MySQL中的utf8mb4和utf8字符集有什么区别?

utf8mb4utf8字符集在MySQL中的区别是什么?

我已经知道美国信息交换标准代码utf - 8utf - 16utf - 32编码; 但是我很好奇utf8mb4编码组与MySQL服务器中定义的其他编码类型有什么不同

使用utf8mb4而不是utf8有什么特别的好处/建议吗?

277215 次浏览

utf - 8是一个变长编码。对于UTF-8,这意味着存储一个代码点需要1到4个字节。然而,MySQL的编码称为"utf8"(“utf8mb3”的别名)每个码位最多只能存储3个字节。

那么字符集&;utf8"/&;utf8mb3"不能存储所有的Unicode码位:它只支持0x000到0xFFFF的范围,即“基础多语言平面"”。 参见Unicode编码的比较.

这是(同一页面的以前版本)MySQL文档必须说的:

名为utf8[/utf8mb3]的字符集每个字符最多使用3个字节,并且只包含BMP字符。从MySQL 5.5.3开始,utf8mb4字符集每个字符最多使用4个字节,支持补充字符:

  • 对于BMP字符,utf8[/utf8mb3]和utf8mb4具有相同的存储特征:相同的编码值,相同的编码,相同的长度。

  • 对于补充字符,Utf8 [/utf8mb3]不能存储字符,而utf8mb4需要四个字节来存储它。由于utf8[/utf8mb3]不能存储字符,在utf8[/utf8mb3]列中没有任何补充字符,当从旧版本的MySQL升级utf8[/utf8mb3]数据时,您不必担心转换字符或丢失数据。

所以如果你想让你的列支持存储位于BMP之外的字符(你通常想这样做),比如emoji,使用"utf8mb4"。另见在实际使用中最常见的非bmp Unicode字符是什么?

utf8mb4字符集很有用,因为现在我们不仅需要支持存储语言字符,还需要支持存储符号、新引入的表情符号等。

Mathias Bynens对如何在MySQL数据库中支持完整的Unicode的一个很好的阅读也可以解释这一点。

摘自MySQL 8.0参考手册:

  • utf8mb4:使用one到Unicode字符集的utf - 8编码 四个字节每个字符

  • utf8mb3:使用one到Unicode字符集的utf - 8编码 三个字节每个字符

MySQL中,utf8目前是utf8mb3的别名,而被弃用将在未来的MySQL版本中被删除。在这一点utf8 将成为一个参考 utf8mb4

所以不管这个别名如何,你都可以有意识地为自己设置一个utf8mb4编码。

为了完成答案,我想在下面添加@ williamamentriken 's注释(也取自手册):

为了避免utf8含义模糊,可以考虑为字符集引用显式指定utf8mb4,而不是utf8

MySQL在5.5.3之后添加了这个utf8mb4代码,Mb4是最多字节4的意思,专门设计为兼容4字节的Unicode。幸运的是,UTF8MB4是UTF8的超集,只是不需要将编码转换为UTF8MB4。当然,为了节省空间,一般使用UTF8就足够了。

最初的UTF-8格式使用1到6个字节,最多可以编码31个字符。最新的UTF-8规范只使用一到四个字节,最多可以编码21位,仅代表所有17个Unicode平面。UTF8是Mysql中的字符集,最多只支持三个字节的UTF-8字符,这是Unicode中的基本多文本平面。

要在Mysql中保存4字节长的UTF-8字符,您需要使用UTF8MB4字符集,但只需5.5。支持3个版本后(查看版本:选择版本();)。我认为为了获得更好的兼容性,你应该总是使用UTF8MB4而不是UTF8。对于char类型的数据,UTF8MB4占用更多的空间,并且根据Mysql的官方建议,使用VARCHAR而不是char。

在MariaDB中,utf8mb4在服务器配置中没有显式设置时作为默认的CHARSET,因此使用COLLATE utf8mb4_unicode_ci。

参考MariaDB CHARSET &核对点击< / >

CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  • utf8是MySQL的旧的,有缺陷的UTF-8实现,它正在被弃用的过程中。
  • utf8mb4是他们为他们的固定UTF-8实现命名的,也是你现在应该使用的。

在他们有缺陷的版本中,只有前64k字符平面中的字符——基本多语平面——可以工作,其他字符被认为无效。在这个平面内的代码点值- 0到65535(其中一些是为特殊原因保留的)可以用最多3个字节的UTF-8多字节编码表示,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将继续明确地指固定版本。