请解释下utf8和utf8mb4的区别

267 阅读2分钟

UTF-8 和 UTF-8MB4 的区别

1. 定义

UTF-8 是一种可变长度的字符编码方式,能够编码 Unicode 字符集中的所有字符。它使用 1 到 4 个字节来表示一个字符,具体取决于字符的不同。

UTF-8MB4 是 UTF-8 的一种扩展,允许使用 4 个字节来编码更多的 Unicode 字符,包括一些特殊字符,如表情符号(emoji)。

2. 字节数

  • UTF-8:

    • 1 字节:ASCII 字符(U+0000 到 U+007F)
    • 2 字节:拉丁文字符(U+0080 到 U+07FF)
    • 3 字节:大部分常用汉字(U+0800 到 U+FFFF)
    • 4 字节:一些较少使用的字符(U+10000 到 U+10FFFF)
  • UTF-8MB4:

    • 仍然支持 1 到 3 字节字符
    • 4 字节字符的支持,使得可以表示 U+10000 到 U+10FFFF 范围内的字符,如emoji和某些罕见的字符。

3. 数据库支持

许多数据库(如 MySQL)在早期版本中默认只支持 UTF-8 编码,但实际上它们使用的 UTF-8 实现是 utf8,只支持最多 3 字节的字符编码。这意味着它无法存储某些 Unicode 字符。

  • MySQL 中的 utf8:
    • 实际上只支持 U+0000 到 U+FFFF 的字符范围。
  • MySQL 中的 utf8mb4:
    • 支持完整的 Unicode 字符集,能够存储所有字符,包括 4 字节的字符。

4. 兼容性

  • 因为 utf8mb4 是对 utf8 的扩展,所以 utf8 的字符可以在 utf8mb4 中正确存储和读取。
  • 然而,反之则不然,当使用 utf8 编码的数据库尝试存储 4 字节字符时,会导致错误。

5. 使用场景

  • UTF-8:

    • 适用于大多数常规文本场景,尤其是只需要存储 ASCII 和普通字符的应用。
  • UTF-8MB4:

    • 适用于需要存储所有 Unicode 字符的应用,比如需要支持表情符号、特殊符号或多语言内容的场景。

6. 实际应用

在设计数据库时,特别是使用 MySQL 等数据库时,建议使用 utf8mb4 而不是 utf8。这样可以确保能够存储所有字符,避免因字符集限制导致的数据丢失或错误。

例如,创建表时应使用:

CREATE TABLE example (
  id INT PRIMARY KEY AUTO_INCREMENT,
  content VARCHAR(255) CHARACTER SET utf8mb4
);

7. 结论

总结来说,UTF-8 是一种通用编码方式,适用于大多数文本数据。然而,UTF-8MB4 是 UTF-8 的扩展,能够支持更多字符,尤其是在需要支持表情符号和其他特殊字符时更为重要。在数据库设计中,使用 utf8mb4 可以保证应用的兼容性和数据的完整性。