不灭的火

革命尚未成功,同志仍须努力下载JDK17

作者:AlbertWen  添加时间:2025-06-02 01:32:14  修改时间:2025-06-26 18:00:41  分类:MySQL/Redis  编辑

最后的结论:

  • MySQL 5.x:字符集选 utf8mb4,排序规则选 utf8mb4_unicode_ci(代替不精确的 utf8mb4_general_ci

  • MySQL 8.0+:字符集选 utf8mb4,排序规则选 utf8mb4_0900_ai_ci(Unicode 9.0 标准,更高效准确)

 


 

在新建 MySQL 数据库时,字符集(Character Set)和排序规则(Collation)的选择至关重要,直接影响数据存储、查询和排序行为。以下是推荐方案及详细说明:

终极推荐方案(2025年适用)

CREATE DATABASE your_database_name
  CHARACTER SET = utf8mb4
  COLLATE = utf8mb4_0900_ai_ci;

📚 核心选择原则

  1. 字符集 (Character Set)
    ✅ 必选 utf8mb4(MySQL 5.5.3+ 支持)

    • 支持所有 Unicode 字符(包括 Emoji、生僻汉字、特殊符号 ✅)

    • 避免使用 utf8(MySQL 中的 utf8 实际是阉割版,仅支持 3 字节字符,无法存储 Emoji ❌)

  2. 排序规则 (Collation)
    根据需求选择(后缀含义):

    • _ci:不区分大小写(Case Insensitive)

    • _cs:区分大小写(Case Sensitive)

    • _ai:不区分重音(Accent Insensitive,如 a = á

    • _as:区分重音(Accent Sensitive)

    • _0900:基于 Unicode 9.0 标准(更精准)


🔍 常见场景推荐

场景描述 推荐排序规则 说明
通用多语言场景(推荐) utf8mb4_0900_ai_ci ✅ MySQL 8.0 默认规则
✅ 不区分大小写和重音
✅ 支持现代 Unicode
需要区分大小写 utf8mb4_0900_as_cs 严格区分 A 和 a(如密码校验)
兼容旧系统 utf8mb4_general_ci ❌ 旧版规则(不推荐,排序算法不精确)
二进制精确匹配 utf8mb4_bin 严格按二进制值比较(区分大小写/重音)

⚠️ 关键注意事项

  1. MySQL 版本差异

    • MySQL 5.x:使用 utf8mb4_unicode_ci(代替不精确的 utf8mb4_general_ci

    • MySQL 8.0+:优先用 utf8mb4_0900_ai_ci(Unicode 9.0 标准,更高效准确)

  2. 字段级覆盖规则

    • 表/字段可单独指定排序规则,但强烈建议库级统一设置,避免混乱:

    • -- 修改已存在的数据库
      ALTER DATABASE your_db CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
  3. 连接字符集一致性
     
    • 确保客户端连接也使用 utf8mb4(在连接字符串中设置):
    • # JDBC 示例
      jdbc:mysql://host/db?characterEncoding=utf8mb4

绝对避免的配置

-- 危险!无法存储 Emoji 和部分中文
CREATE DATABASE ... CHARSET=utf8; 

-- 过时且排序不精确(如中文排序错误)
CREATE DATABASE ... COLLATE=utf8mb4_general_ci;

📊 为什么选 utf8mb4_0900_ai_ci

对比项 utf8mb4_general_ci utf8mb4_0900_ai_ci
Unicode 标准 旧版 UCA 4.0 新版 Unicode 9.0
算法效率 ⚠️ 简单快速(不精确) ✅ 优化后性能接近
多语言排序准确性 ❌ 中文/藏文等排序可能错误 ✅ 严格遵循 Unicode 规则
Emoji 支持 ⚠️ 部分支持 ✅ 完整支持
大小写/重音处理 只支持 _ci 支持 _ai_ci/_as_cs 等组合

💡 实际测试:在中文+英文+Emoji混合排序时,utf8mb4_0900_ai_ci 结果更符合预期。

修改已有数据库的字符集

-- 1. 修改数据库默认规则
ALTER DATABASE your_db CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

-- 2. 转换所有表(生成修改语句)
SELECT CONCAT(
  'ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;'
) 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = 'your_db';

总结

✅ 字符集 = utf8mb4

✅ 排序规则 = utf8mb4_0900_ai_ci(通用场景) 或 utf8mb4_0900_as_cs(需区分大小写)

此配置可完美兼容中文、英文、Emoji及全球99%语言,同时保证未来扩展性!