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,而不是服务器级别的。

相关推荐
云絮.1 天前
数据库操作
数据库·mysql·算法·oracle
设计师小聂!1 天前
宝塔 Linux 面板保姆级教程
linux·mysql·开源·运维开发
Tong Z1 天前
Mysql DDL中的ALGORITHM
数据库·mysql
minji...1 天前
MySQL数据库 (七) MySQL表的基本查询(上),insert、replace、select、where、order by
数据库·mysql·select·replace·insert·order by·where
折戟不必沉沙1 天前
mysql忘记密码
数据库·mysql
kuonyuma1 天前
MyBatis入门·注解操作
java·spring boot·mysql·spring·mybatis
聪明努力的积极向上1 天前
【claude code】MySQL MCP 配置完整指南
数据库·mysql·ai编程
DIY源码阁1 天前
JavaSwing酒店管理系统 - MySQL版
java·mysql·eclipse
川石课堂软件测试1 天前
UI自动化测试|元素操作&浏览器操作实践
功能测试·测试工具·mysql·ui·docker·容器·单元测试
码不停蹄的玄黓1 天前
MySQL 慢查询日志 核心参数详解
数据库·mysql