在 MySQL 8.0 中创建数据库时,选择正确的字符集和排序规则非常重要。这关系到你的数据库能否正确存储和处理各种语言的字符,特别是像表情符号(emoji)这样的特殊字符。

核心推荐 (MySQL 8.0 及以后版本):

  • 字符集 (Character Set): 强烈推荐选择 utf8mb4
  • 排序规则 (Collation): 推荐选择 utf8mb4_0900_ai_ci (这是 MySQL 8.0 的默认排序规则)。

为什么选择 utf8mb4 而不是 utf8mb3 (或其他)?

  1. utf8mb3 (历史上的 utf8):

    • 含义: 使用最多 3 个字节来存储一个字符。
    • 覆盖范围: 只能存储 Unicode 基本多文种平面 (Basic Multilingual Plane, BMP) 中的字符。这包括了绝大部分常用的语言字符(如拉丁字母、西里尔字母、大部分中日韩字符等)。
    • 缺点: 无法存储需要 4 个字节的 Unicode 字符。最常见的例子就是表情符号 (emoji),还有一些不常用的汉字、数学符号、音乐符号等。
    • 历史: 在 MySQL 5.5.3 之前,MySQL 中的 utf8 实际上就是 utf8mb3 的别名。为了避免混淆并明确支持完整的 UTF-8,MySQL 后来引入了 utf8mb4 并将旧的 utf8 指向 utf8mb3。在 MySQL 8.0 中,utf8mb3 被视为遗留字符集。
  2. utf8mb4:

    • 含义: 使用最多 4 个字节来存储一个字符。
    • 覆盖范围: 能够存储所有 Unicode 字符,包括 BMP 字符和辅助平面 (Supplementary Planes) 中的字符(如 emoji 和罕见字符)。
    • 优点: 提供了最广泛的字符支持,是真正意义上的 UTF-8 实现,能够适应现代互联网应用的需求(尤其是移动端 emoji 的广泛使用)。
    • MySQL 8.0 默认值: 从 MySQL 8.0 开始,utf8mb4 及其对应的排序规则 utf8mb4_0900_ai_ci 成为了默认的字符集和排序规则,这表明了官方的推荐方向。
  3. 其他字符集 (如 latin1, gbk等):

    • latin1 (ISO 8859-1): 主要支持西欧语言,无法存储中文、日文、韩文、emoji 等。
    • gbk: 主要用于简体中文,但不是国际标准,不支持繁体中文、日韩文、emoji 等。
    • 这些字符集在需要支持多语言或现代字符(如 emoji)的场景下,兼容性远不如 utf8mb4不推荐在新项目中使用。

总结 utf8mb3 vs utf8mb4 的关键区别:

特性 utf8mb3 (旧称 utf8) utf8mb4
最大字节数 3 字节 4 字节
Unicode 范围 基本多文种平面 (BMP) 所有 Unicode 字符 (包括辅助平面)
Emoji 支持 不支持 支持
MySQL 8.0 推荐 不推荐 (视为遗留) 强烈推荐 (默认值)

关于排序规则 (Collation):

排序规则定义了字符集内字符的比较和排序方式。它会影响 ORDER BY, GROUP BY, 字符串比较 (=, >, < 等) 以及索引的使用。

  • utf8mb4_0900_ai_ci: 这是 MySQL 8.0 推荐的 utf8mb4 默认排序规则。
    • 0900: 指的是基于 Unicode Collation Algorithm (UCA) 9.0.0 版本,提供了更准确、更符合现代语言习惯的排序。
    • ai: Accent Insensitive (不区分重音符号)。例如,‘a’ 和 ‘á’ 在比较时被视为相等。
    • ci: Case Insensitive (不区分大小写)。例如,‘a’ 和 ‘A’ 在比较时被视为相等。
  • 其他常见排序规则:
    • utf8mb4_general_ci: 较旧的排序规则,排序准确性不如 _0900_ 系列,但可能在某些旧场景下性能稍快(差异通常不显著)。不推荐在新项目使用。
    • utf8mb4_unicode_ci: 比 _general_ci 更准确一些,但也不如 _0900_ 系列。
    • utf8mb4_bin: 二进制排序。直接比较字符的二进制值,区分大小写、重音,速度最快,但排序结果可能不符合人类语言习惯。
    • utf8mb4_xxxx_as_cs: as (Accent Sensitive) 表示区分重音,cs (Case Sensitive) 表示区分大小写。根据需要选择。
    • 特定语言的排序规则 (如 utf8mb4_ja_0900_as_cs for Japanese)。

选择建议:

  • 对于绝大多数新项目,直接使用 MySQL 8.0 的默认设置:CHARACTER SET utf8mb4COLLATE utf8mb4_0900_ai_ci。这提供了最好的兼容性和最准确的通用排序规则(不区分大小写和重音)。
  • 如果你需要区分大小写或重音进行比较和排序,可以选择对应的 _cs_as 排序规则,例如 utf8mb4_0900_as_cs
  • 除非有非常明确的理由(如与极旧的系统兼容),否则避免使用 utf8mb3

如何在创建数据库时指定:

CREATE DATABASE your_database_name
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;

如果你不指定,MySQL 8.0 会自动使用服务器配置的默认值,通常就是 utf8mb4utf8mb4_0900_ai_ci

总之,在 MySQL 8.0 中,请优先并放心地选择 utf8mb4 字符集和 utf8mb4_0900_ai_ci (或其他 utf8mb4_0900_xx_xx) 排序规则,以确保最佳的兼容性和功能性。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐