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

时间:2015-05-06 10:45:12

标签: mysql encoding utf-8 character-encoding utf8mb4

MySQL utf8mb4utf8字符集之间有什么区别?

我已经知道 ASCII UTF-8 UTF-16 UTF-32 编码; 但我很想知道utf8mb4编码组与 MySQL服务器中定义的其他编码类型的区别。

使用utf8mb4而不是utf8是否有任何特殊利益/建议?

5 个答案:

答案 0 :(得分:303)

UTF-8是一种可变长度编码。在UTF-8的情况下,这意味着存储一个代码点需要一到四个字节。但是,MySQL的编码称为" utf8" (" utf8mb3"的别名)每个代码点最多只存储三个字节。

所以字符集" utf8" /" utf8mb3"不能存储所有Unicode代码点:它只支持0x000到0xFFFF的范围,称为" Basic Multilingual Plane"。 另请参阅Comparison of Unicode encodings

这是the MySQL documentation的同一页面的先前版本必须说明的内容:

  

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

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

  •   
  • 对于补充字符, utf8 [/ utf8mb3]无法存储该字符,而utf8mb4需要四个字节来存储它。由于utf8 [/ utf8mb3]根本无法存储字符,因此在utf8 [/ utf8mb3]列中没有任何补充字符,并且在升级旧版本的utf8 [/ utf8mb3]数据时无需担心转换字符或丢失数据的MySQL。

  •   

因此,如果您希望列支持存储位于BMP之外的字符(通常是您想要的),例如emoji,请使用" utf8mb4"。另请参阅What are the most common non-BMP Unicode characters in actual use?

答案 1 :(得分:44)

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

Mathias Bynens对How to support full Unicode in MySQL databases的精彩解读也可以说明这一点。

答案 2 :(得分:17)

取自MySQL 8.0 Reference Manual

  
      
  • utf8mb4 Unicode 字符集的 UTF-8 编码,使用   每个字符四个字节

  •   
  • utf8mb3 Unicode 字符集的 UTF-8 编码,使用   每个字符三个字节

  •   

MySQL 中的utf8当前是utf8mb3的别名,已被淘汰,并将在以后的 MySQL中删除发布。届时,utf8 将成为对 utf8mb4的引用。

因此,不管使用哪个别名,您都可以自觉地为自己设置utf8mb4编码。

答案 3 :(得分:2)

  • utf8是MySQL较旧的,有缺陷的UTF-8实现,正在逐步淘汰。
  • utf8mb4是他们命名的固定UTF-8实现的名称,也是您现在应该使用的名称。

在有缺陷的版本中,只有基本多语言平面中的字符有效,而其他字符则被视为无效。这是因为该平面内的代码点值-0到65535(其中一些是出于特殊原因保留的)可以用最多3个字节的UTF-8多字节编码表示,而MySQL的早期版本是UTF-8任意决定将其设置为限制。

早在MySQL发布此功能时,这并不是什么大问题。从那时起,越来越多的新定义的字符范围已被添加到Unicode,并且其值超出了基本的多语言平面。 Unicode本身定义了17个平面,尽管其中10个尚未使用。

为了不破坏旧代码做出任何特殊假设,MySQL保留了已损坏的实现,并将其称为更新的固定版本utf8mb4。这引起了一些混淆,因为该名称被误解为好像是对UTF-8的某种扩展,而不是MySQL当前对UTF-8的真实实现。

将来的MySQL版本最终将淘汰旧版本,现在可以认为它已被弃用。在可预见的将来,您需要使用utf8mb4来确保正确的UTF-8编码。经过足够的时间后,当前的utf8将被删除,并且在将来的某个日期utf8将再次上升,这一次是指固定版本,尽管utf8mb4将继续明确地指代到固定版本。

让我们弄清楚一点:有缺陷的实现绝不是对UTF-8规则的正确解释,因为UTF-8绝没有定义为每个字符最多允许3个字节。实际上,最早的UTF-8定义将其定义为最多6个字节。 MySQL的原始版本总是被任意破坏。

答案 4 :(得分:-1)

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

原始UTF-8格式使用1到6个字节,最多可以编码31个字符。最新的UTF-8规范仅使用1-4个字节,最多可以编码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。

Refer MariaDB CHARSET & COLLATE Click

CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;