当前位置: 首页 > news >正文

Mysql的utf8mb4_general_ci 与 utf8mb4_bin 的具体区别是什么?中文适合哪个?

1. utf8mb4_general_ci vs utf8mb4_bin 的具体区别

utf8mb4_general_ciutf8mb4_bin 都是 utf8mb4 编码的排序规则(collation),它们主要在 排序(ORDER BY)比较(WHERE) 时的行为不同:

排序规则是否区分大小写是否区分重音速度适用场景
utf8mb4_general_ci❌ 不区分❌ 不区分✅ 更快适用于一般文本,如用户名、标题
utf8mb4_bin✅ 区分✅ 区分⛔ 更慢适用于密码、唯一标识符
(1) utf8mb4_general_ci(Case-Insensitive,不区分大小写)
  • CI 代表 “Case Insensitive”,表示比较时 不区分大小写,也 不区分重音符号
  • 例如:
    SELECT 'a' = 'A';  -- 结果是 TRUE
    SELECT 'résumé' = 'resume'; -- 结果是 TRUE
    
    utf8mb4_general_ci 主要适用于 对大小写或重音符号不敏感的文本(如用户名、标签等)。
(2) utf8mb4_bin(Binary,区分大小写)
  • utf8mb4_bin 按照 二进制编码 逐字节进行比较,因此大小写、重音符号完全不同。
  • 例如:
    SELECT 'a' = 'A' COLLATE utf8mb4_bin; -- 结果是 FALSE
    SELECT 'résumé' = 'resume' COLLATE utf8mb4_bin; -- 结果是 FALSE
    
    utf8mb4_bin 适用于 严格区分大小写的场景(如密码、文件名、唯一标识符)。

2. 除了 utf8mb4_general_ciutf8mb4_bin,还有哪些?

utf8mb4 编码有多种排序规则,主要区别在于:

  • 是否区分大小写
  • 是否区分重音
  • 排序算法
(1) 常见的 utf8mb4 排序规则
排序规则是否区分大小写是否区分重音适用场景
utf8mb4_general_ci❌ 不区分❌ 不区分一般文本,如用户名、标题
utf8mb4_general_cs✅ 区分❌ 不区分需要区分大小写但不区分重音的场景
utf8mb4_unicode_ci❌ 不区分✅ 区分多语言支持,如 ée
utf8mb4_unicode_cs✅ 区分✅ 区分多语言场景,严格匹配
utf8mb4_bin✅ 区分✅ 区分密码、唯一标识符
(2) utf8mb4_general_ci vs utf8mb4_unicode_ci
特性utf8mb4_general_ciutf8mb4_unicode_ci
是否区分大小写❌ 不区分❌ 不区分
是否区分重音❌ 不区分✅ 区分
是否符合 Unicode 规则⛔ 不完全符合✅ 符合 Unicode 排序规则
速度✅ 快⛔ 稍慢
  • utf8mb4_general_ci 适用于性能优先的应用,它的比较方式比较简单,不完全符合 Unicode 规则。
  • utf8mb4_unicode_ci 适用于多语言支持,比如 德语的 ß 应该等于 ss,但 utf8mb4_general_ci 可能不会正确处理。

3. 选择排序规则的建议

  • 大小写不敏感、不关注重音: utf8mb4_general_ci(性能更快)
  • 大小写不敏感、但区分重音: utf8mb4_unicode_ci(多语言支持更好)
  • 大小写敏感、但不区分重音: utf8mb4_general_cs
  • 大小写敏感、也区分重音: utf8mb4_unicode_cs
  • 严格区分大小写、适用于 ID/密码等: utf8mb4_bin

5. 总结

  • utf8mb4_general_ci:不区分大小写、不区分重音,适用于一般文本。
  • utf8mb4_bin:严格区分大小写和重音,适用于唯一标识符(如密码、UUID)。
  • utf8mb4_unicode_ci:符合 Unicode 规则,适用于多语言支持。

适合用中文的是?

如果你的数据包含中文,建议使用 utf8mb4_unicode_ciutf8mb4_unicode_520_ci,因为它们能够更准确地进行排序和比较。下面是不同排序规则在处理中文时的特点:

1. utf8mb4_general_ci vs. utf8mb4_unicode_ci 处理中文的区别

排序规则是否区分大小写是否区分重音是否适合中文排序规则准确性
utf8mb4_general_ci❌ 不区分❌ 不区分⚠️ 基本支持,但排序不准确🚫 较差
utf8mb4_unicode_ci❌ 不区分✅ 区分更适合中文,符合 Unicode 规范准确
utf8mb4_unicode_520_ci❌ 不区分✅ 区分最新 Unicode 规则,适合中文更准确
utf8mb4_bin✅ 区分✅ 区分不适合中文排序(仅适用于精确匹配,如密码)🚫 排序无意义

2. 为什么 utf8mb4_general_ci 不适合中文?

utf8mb4_general_ci 主要是针对拉丁字符优化,它对汉字的处理方式较为简单,可能会导致 排序不符合中文习惯,例如:

SELECT '中' > '啊' COLLATE utf8mb4_general_ci;
  • utf8mb4_general_ci 可能会 按照字符编码顺序 排序,而不是按拼音或部首排序,这样会出现 “中” 排在 “啊” 之前,这并不符合常见的中文排序规则。

3. utf8mb4_unicode_ci 更适合中文

  • utf8mb4_unicode_ci 遵循 Unicode 标准,能够正确地比较和排序 汉字、拼音、部首,在处理中文时比 utf8mb4_general_ci 更准确
  • 例如:
    SELECT '中' > '啊' COLLATE utf8mb4_unicode_ci;
    
    utf8mb4_unicode_ci 规则下,“啊” 会排在 “中” 之前,符合拼音排序规则(AZ 之前)。

4. utf8mb4_unicode_520_ci 适用于最新 Unicode 标准

  • utf8mb4_unicode_520_ciUnicode 5.2 版本的排序规则,它在 utf8mb4_unicode_ci 的基础上 进一步优化了字符排序,对于现代 Unicode 处理更完善。
  • 例如:
    SELECT '𠜎' > '中' COLLATE utf8mb4_unicode_520_ci;
    
    utf8mb4_unicode_520_ci 下,可以正确处理扩展汉字,避免某些生僻字排序错误。

5. 选择适合中文的排序规则

适用场景推荐排序规则
普通中文文本(适用于大多数情况)utf8mb4_unicode_ci
最新 Unicode 规则(支持扩展汉字)utf8mb4_unicode_520_ci
大小写敏感,适用于特定情况utf8mb4_unicode_cs
严格区分大小写和重音(如密码存储)utf8mb4_bin

6. 结论

如果你存储中文,并且希望排序、比较符合 Unicode 规范,推荐

utf8mb4_unicode_ci

如果你希望使用最新 Unicode 5.2 标准,并支持更多生僻字,推荐

utf8mb4_unicode_520_ci

⚠️ 避免 utf8mb4_general_ci,因为它不适用于中文排序 🚫

utf8mb4_unicode_520_ci 是mysql5.7 有吗?

utf8mb4_unicode_520_ci 在 MySQL 5.7 支持的

1. utf8mb4_unicode_520_ci 在 MySQL 版本的支持情况

排序规则MySQL 5.5MySQL 5.6MySQL 5.7MySQL 8.0
utf8mb4_general_ci✅ 支持✅ 支持✅ 支持✅ 支持
utf8mb4_unicode_ci✅ 支持✅ 支持✅ 支持✅ 支持
utf8mb4_unicode_520_ci不支持不支持支持支持

MySQL 5.7 引入了 utf8mb4_unicode_520_ci,它基于 Unicode 5.2 标准,相比 utf8mb4_unicode_ci(基于 Unicode 4.0),提供了更准确的字符排序,尤其是对于 扩展汉字、emoji、某些特殊符号


2. 如何在 MySQL 5.7 检查 utf8mb4_unicode_520_ci 是否可用?

运行以下 SQL 语句:

SHOW COLLATION WHERE Collation LIKE 'utf8mb4_unicode_520_ci';

如果返回结果,说明 MySQL 5.7 支持该排序规则 ✅。

如果没有结果,可能是 MySQL 版本较低(如 5.6 或 5.5),可以运行:

SELECT VERSION();

检查 MySQL 版本。


3. 在 MySQL 5.7 中使用 utf8mb4_unicode_520_ci

创建表
CREATE TABLE test_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) COLLATE utf8mb4_unicode_520_ci
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
修改表的排序规则
ALTER TABLE test_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
修改数据库默认排序规则
ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;

4. utf8mb4_unicode_520_ci vs utf8mb4_unicode_ci

规则utf8mb4_unicode_ciutf8mb4_unicode_520_ci
Unicode 版本Unicode 4.0Unicode 5.2
生僻字 & emoji 处理可能不准确更准确
法语、德语等特殊字符排序不完整更符合规范
扩展汉字 & 拼音排序较好更好

5. 结论

MySQL 5.7 支持 utf8mb4_unicode_520_ci,适用于 更准确的中文排序
如果是 MySQL 5.6 或更早版本,utf8mb4_unicode_520_ci 不可用,可以用 utf8mb4_unicode_ci 代替

相关文章:

  • 如何使用 ONLYOFFICE 宏对 PDF 表单中的特定字段执行计算
  • Gemini Robotics:Google DeepMind 让 AI 机器人真正“动”起来!
  • DeepSeek模型本地化部署方案及Python实现
  • Linux笔记---文件系统硬件部分
  • 大语言模型学习及复习笔记(1)语言模型的发展历程
  • TTL肖特基触发器
  • 睡不着营养补充贴士
  • 特种作业高压电工考试练习题库
  • 每日一题----------set接口及其内容(未)
  • 嵌入式人工智能应用- 第八章 车牌识别
  • AI应用加速落地丨MaxKB正在被政府、公共事业、教育和医疗行业用户广泛采纳
  • 如何学习VBA_3.2.20:DTP与Datepicker实现日期的输入
  • SpringBoot当中当主线程使用异步处理其他流程的时候需要获取上下文会出现什么情况详解
  • 蓝桥杯备赛-入门训练题 day1
  • 当今前沿技术:人工智能与区块链的未来发展
  • 每天五分钟深度学习框架PyTorch:算法模型的保存和加载(CPU和GPU)
  • Android Media3 ExoPlayer 开发全攻略:从基础集成到高级功能实战
  • 使用python的原始模块与网站交互
  • 工业触摸屏在调色机械设备中的应用
  • 通义万相 2.1 与蓝耘智算平台的深度协同,挖掘 AIGC 无限潜力并释放巨大未来价值
  • 新希望去年归母净利润4.74亿同比增逾九成,营收降27%
  • 博物馆有一项活动40岁以上不能参加?馆方回应
  • 国防部就美军“压力测试”大演习答澎湃:中国从来不信邪,不怕打,不怕压
  • 商务部召开外资企业圆桌会
  • 刺激视网膜可让人“看”到全新颜色
  • 泽连斯基提议乌俄“立即、全面和无条件”停火