2015-05-06 32 views
146

utf8mb4utf8 charsets in mysql和有什么不一样?
我已经知道关于ASCII,UTF-8,UTF-16UTF-32编码; 但我很想知道'utf8mb4'编码组与其他编码类型在mysql服务器中定义的区别是什么。mysql中的utf8mb4和utf8 charsets有什么区别?

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

回答

166

UTF-8是可变长度编码。对于UTF-8,这意味着存储一个代码点需要一到四个字节。但是,名为“utf8”的MySQL编码只能存储每个代码点最多三个字节。

所以字符集“utf8”不能存储所有的Unicode代码点:它只支持范围0x000到0xFFFF,这就是所谓的“Basic Multilingual Plane”。 另请参阅Comparison of Unicode encodings

这是the MySQL documentation不得不说的是:

命名为UTF-8字符集最多使用的每个字符三个字节,只包含BMP字符。如MySQL的5.5.3中,utf8mb4字符集使用最多的每个字符四个字节支持补充字符:

  • 对于BMP字符,UTF8和utf8mb4具有相同的存储特性:相同的码值,相同的编码,相同的长度。

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

所以,如果你想你的专栏,以支持存储字符躺在BMP外(和你平时想),如emoji,用“utf8mb4”。另见What are the most common non-BMP Unicode characters in actual use?

+5

我遇到的唯一案例(迄今为止)utf8mb4是'必需的'是中文和表情符号。有需要它的模糊字母。 –

+16

中文 - 中文+韩文+日文应该不需要MySQL的'utf8'覆盖的基本多语言平面。也就是说,现在没有理由不使用'utf8mb4',并且确实需要所有新的表情符号,例如 – thomasrutter

+3

如果您使用它来将加密的密码和数据保存在数据库中,它也是必需的。我使用正常的utf8格式在mysql中保存加密的密码,这使得我随机使用一些密码很麻烦,而且很难调试,所以最后我尝试使用base64编码并暂时解决了这个问题。但是,现在我知道原因。 –

14

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

Mathias Bynens在How to support full Unicode in MySQL databases上的一个很好的阅读也可以对此有所了解。