news 2026/10/15 19:16:13

MySQL-1267错误:排序规则冲突的原因与解决方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL-1267错误:排序规则冲突的原因与解决方案

一、问题背景

执行关联查询时,有时会遇到下面的错误:

SELECT s.* FROM sg_corporatesign s JOIN pj_billsignrecord d ON d.signFullName = s.name AND d.signStatus = 2;

1267 - Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '='

错误的意思是:参与等值比较的两个字符串使用了不同的排序规则,MySQL 无法为这次比较自动确定采用哪一个规则。

二、问题分析

1、都用了 utf8mb4,为什么还会报错?

字符集和排序规则是两个不同的概念:

概念解决的问题示例
字符集(Character Set)字符如何编码、可以表示哪些字符utf8mb4
排序规则(Collation)字符串如何比较大小、判断相等和排序utf8mb4_unicode_ci

两个字段都能存中文,并不意味着它们采用相同的比较规则。

本次错误涉及的规则中,signFullName使用的是utf8mb4_0900_ai_ci排序规则,而utf8mb4_0900_ai_ci基于 Unicode 9.0 的排序算法,ai表示不区分重音,ci表示不区分大小写;name使用的是utf8mb4_unicode_ci排序规则,utf8mb4_unicode_ci是较早的 Unicode 排序规则,也不区分大小写。它们不能简单地视为同一个规则的两个名字。一旦两个关联字段的排序规则不一致的话,就可能产生本文出现的错误。

2、问题通常是怎么出现的?

常见原因是表结构经过多次演变,相关字段的定义逐渐不一致:

  • 新建表采用了utf8mb4_0900_ai_ci,旧表保留utf8mb4_unicode_ci,关联时发生冲突。
  • 导入外部数据表、创建临时表时,采用了不同的默认规则。
  • 跨库查询涉及的字段分别继承了各自数据库或表的默认配置。

3、解决方案

(1)、在查询中显式指定 COLLATE

当暂时不能修改表结构时,可以明确指定比较采用的规则:

SELECT s.* FROM sg_corporatesign s JOIN pj_billsignrecord d ON d.signFullName COLLATE utf8mb4_unicode_ci = s.name COLLATE utf8mb4_unicode_ci AND d.signStatus = 2;

COLLATE在 MySQL 中表示指定字符串的比较和排序规则,也可以理解为使用显式统一的规则来进行比较。当然,也不会修改字段本身的定义或保存的数据。

(2)、统一相关字段的排序规则

如果两个字段长期用于关联,通常应该在结构层面统一定义。假设已经确定sg_corporatesign表的name字段,与pj_billsignrecord表的signFullName字段的排序规则应该设置为相同。

ALTER TABLE pj_billsignrecord MODIFY COLUMN signFullName VARCHAR(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

三、小结

总上所述,COLLATE用于指定字符串的比较和排序规则,决定比较时是否区分大小写、重音等。字符集相同的字段,也可能因为排序规则不同,在关联或等值比较时触发Illegal mix of collations错误。临时处理可以在 SQL 中通过COLLATE明确比较规则;长期解决则应根据业务需求,统一相关字段的排序规则,并验证查询结果、唯一约束和索引使用情况。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 19:16:07

C罗半场被换下,利雅得胜利10人连进3球逆转

利雅得胜利主场,上半场0比2落后,门将早早被罚下。中场休息,主教练把C罗换了下来,转播镜头扫过他的脸,表情不太好看。下半场,没有C罗的利雅得胜利,10个人连进三球,3比2逆转。 同一周&…

作者头像 李华
网站建设 2026/10/15 19:15:49

codex会话已在另一个应用被打开

前两天ssh服务器打开codex的一个对话发现无法打开并且出现了提示:已在另一个应用中打开 请先在那边关闭会话,才能在这里继续。搜寻了一下网上的一些解决办法,我是用到第二步恢复的,有遇到这种问题的可以参考一下下面的内容。 这种…

作者头像 李华
网站建设 2026/10/15 19:15:17

Cocos2d面试核心考点全解析:从生命周期到渲染优化

拿到这个题目,我就知道是给准备入行或者想跳槽的游戏开发朋友准备的。很多人在面试前捧着框架文档背题目,结果一到现场,面试官往深了问一句"为什么",就卡壳了。这篇文章不打算给你罗列一堆标准答案,而是把Co…

作者头像 李华
网站建设 2026/10/15 19:14:39

从“程序会不会停”说起:停机问题为何不可判定

进度条卡在 99%,风扇狂转,任务管理器里那个进程的 CPU 占用一路飙红,你等了五分钟,它还在原地打转。那一刻你多半会冒出一个念头:要是能有个工具提前告诉我,这程序跑起来到底会不会死循环、永不退出&#x…

作者头像 李华
网站建设 2026/10/15 19:14:21

Agent 每天合入三万次代码,git 为什么撑不住了?

Agent 每天合入三万次代码,git 为什么撑不住了? 一、一个反常的瓶颈 一家公司里,写代码这件事突然不再慢了。 五个月前,Anthropic 平均每天合入 2500 次代码变更。到九月,这个数字是 30000 次以上。增长超过十倍&am…

作者头像 李华