MySQL字符集排序规则冲突问题(utf8mb4_unicode_ci和utf8mb4_0900_ai_ci )

文章目录

MySQL字符集排序规则冲突问题(utf8mb4_unicode_ci和utf8mb4_0900_ai_ci )

问题

不同 collation 的表进行 JOIN 操作报错:

bash 复制代码
Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '='

排序字符集

utf8mb4_unicode_ci

字符集:utf8mb4

排序规则:基于 Unicode Collation Algorithm (UCA) 的较早版本(历史上对应较老的 Unicode 版本实现)

后缀:_ci = case-insensitive(不区分大小写)

  • utf8mb4_unicode_ci 是基于标准的 Unicode 来排序和比较,能够在各种语言之间精确排序
  • utf8mb4_general_ci 没有实现 Unicode 排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致。
  • 但是绝大多数情况下,这些特殊字符的顺序并不需要那么精确。

utf8mb4_0900_ai_ci

字符集:utf8mb4

排序规则:基于 UCA 9.0.0(0900 就是 9.0.0)

后缀:_ai = accent-insensitive(不区分重音/音标差异),_ci = 不区分大小写

这是 MySQL 8.0 时代的"新默认系"之一(常见默认是 utf8mb4_0900_ai_ci)

推荐用 utf8mb4_unicode_ci,但是用 utf8mb4_general_ci 也没啥问题。

MySQL 8.0 默认的是 utf8mb4_0900_ai_ci,属于 utf8mb4_unicode_ci 中的一种,具体含义如下:

  • uft8mb4 表示用 UTF-8 编码方案,每个字符最多占 4 个字节。
    0900 指的是 Unicode 校对算法版本。(Unicode 归类算法是用于比较符合 Unicode 标准要求的两个 Unicode 字符串的方法)。
  • ai 指的是口音不敏感。也就是说,排序时 e,è,é,ê 和 ë 之间没有区别。
  • ci 表示不区分大小写。也就是说,排序时 p 和 P 之间没有区别。
  • utf8mb4 已成为默认字符集,在 MySQL 8.0.1 及更高版本中将 utf8mb4_0900_ai_ci 作为默认排序规则。以前,utf8mb4_general_ci 是默认排序规则。由于 utf8mb4_0900_ai_ci 排序规则现在是默认排序规则,因此默认情况下新表格可以存储基本多语言平面之外的字符。

如果是mysql8.0,将相关表/字段的 collation 统一为数据库默认 utf8mb4_0900_ai_ci,以消除跨表字符串比较时的 collation 冲突,提升线上查询稳定性并降低后续维护成本。

选型建议

  • 新项目 / MySQL 8.0 优先:用 utf8mb4_0900_ai_ci(更符合现代 Unicode 排序,跨语言更一致)。
  • 需要严格区分重音(é ≠ e):不要用 ai,改用 utf8mb4_0900_as_ci(accent-sensitive)或更严格的 _bin。
  • 需要严格区分大小写:用 _cs(case-sensitive)或 _bin。
  • 老系统兼容/跨版本一致(例如 5.7 与 8.0 混跑):常会保留 utf8mb4_unicode_ci,避免升级后排序/唯一性行为变化带来的隐性问题。

生产环境思路:应该先检查数据库默认字符集和 collation,统一相关表的 collation 为数据库服务器默认。

表创建时没有显式指定 COLLATE,它继承的是 数据库级别 的 collation

执行前建议先确认数据库 collation

sql 复制代码
SHOW VARIABLES LIKE 'collation_%';

当 CREATE TABLE 没有显式指定 COLLATE 时,表继承的是 数据库级别 (collation_database) 的 collation,而不是服务器级别的。

相关推荐
雨落在了我的手上16 分钟前
MySQL数据库基础(6):增删改查操作(1)
数据库·mysql
ao-weilai40 分钟前
MySQL数据库:用户管理
数据库·mysql·adb
ao-weilai2 小时前
MySQL数据库:C语言连接MySQL教程
c语言·数据库·mysql
SatanII2 小时前
MySQL 数据库学习总结|理论 + SQL 实训完整笔记
数据库·学习·mysql
.冰块.2 小时前
MySQL下篇 运维实战:备份恢复 + 主从复制 + MHA 高可用,含完整拓扑
运维·mysql·读写分离·高可用·主从复制·mha
Yyyyyy~2 小时前
[Mysql] 数据类型
数据库·mysql
龙腾-虎跃3 小时前
Docker 一键启动服务合集:Redis、MySQL、Kafka、MinIO、Prometheus 等(网盘转存防失效)
redis·mysql·docker·kafka·prometheus·小龙虾·miniio
闲云野鹤在人间15 小时前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
要开心吖ZSH16 小时前
MySQL 慢 SQL 排查操作手册-个人笔记版
java·笔记·sql·mysql·慢查询
Gl�ria18 小时前
MySQL 单机版 vs 高可用版:宕机排查 + 故障处理
mysql·adb·架构