在新建 MySQL 数据库时,选择合适的 字符集(Character Set)排序规则(Collation) 对数据存储、查询和多语言支持至关重要。以下是推荐配置及场景分析:


1. 字符集(Character Set)

推荐选择
  • utf8mb4(✅ 绝对首选)
  • 原因
  • 完整支持 Unicode(包括 Emoji、生僻字、特殊符号等)。
  • MySQL 的 utf8 实际上是阉割版(仅支持 3 字节字符,不兼容 Emoji),而 utf8mb4 是真正的 4 字节 UTF-8。
  • 适用场景
  • 所有现代 Web 应用(尤其是多语言、国际化项目)。
其他选项(不推荐)
  • utf8:历史遗留选项,存在兼容性问题。
  • latin1:仅支持西欧字符,不适合非拉丁语系(如中文)。

2. 排序规则(Collation)

排序规则决定字符串的比较和排序方式,根据需求选择:

(1) 通用推荐
  • utf8mb4_unicode_ci
  • 基于 Unicode 标准排序,支持多语言(如中文、英文、阿拉伯语混合排序)。
  • 不区分大小写ci = case insensitive)。
  • 适合大多数场景(如用户昵称、内容存储)。
(2) 需要区分大小写
  • utf8mb4_bin
  • 直接按二进制值比较,区分大小写
  • 适用场景:密码哈希、严格区分大小写的业务逻辑。
(3) 其他常见选项
  • utf8mb4_general_ci:旧版排序规则,性能略高但排序准确性不如 unicode_ci(已过时)。
  • utf8mb4_0900_ai_ci:MySQL 8.0+ 新规则,支持更现代的 Unicode 标准(需确认版本兼容性)。

3. 创建数据库时的 SQL 示例

CREATE DATABASE my_database CHARACTER SET utf8mb4          -- 字符集COLLATE utf8mb4_unicode_ci;    -- 排序规则

4. 关键注意事项

  1. 表字段需显式指定字符集
    即使数据库设置了 utf8mb4,表或字段仍需明确指定,避免继承服务器默认配置(可能是 latin1):
CREATE TABLE users (name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
);
  1. 连接层配置
    确保客户端连接时也使用 utf8mb4(如 JDBC URL 添加参数):
spring.datasource.url=jdbc:mysql://localhost:3306/my_db?useUnicode=true&characterEncoding=utf8mb4
  1. MySQL 版本要求
  • utf8mb4 需 MySQL 5.5.3+ 版本。
  • 如果使用 Emoji,确保字段长度足够(如 VARCHAR(255) 而非 VARCHAR(255) CHARSET utf8mb4)。

5. 为什么不用 utf8_general_ci?

  • 过时:对多语言排序不准确(如中文拼音排序错误)。
  • 性能差异忽略不计:现代服务器上 unicode_cigeneral_ci 的性能差距可忽略。

总结

  • 字符集:无脑选 utf8mb4
  • 排序规则
  • 默认选 utf8mb4_unicode_ci(兼顾多语言和兼容性)。
  • 严格区分大小写选 utf8mb4_bin

此配置能覆盖 99% 的应用场景,避免未来因字符集问题导致的乱码或数据迁移困难!