如何解决内连接中utf8mb4_unicode_ci与utf8mb4_general_ci排序规则冲突错误?
解决MySQL排序规则冲突(Illegal mix of collations)问题
错误原因
你遇到的Illegal mix of collations错误,是因为JOIN条件中cb_receipt.code和upload_transaksi.code两个字段使用了不同的字符排序规则(分别为utf8mb4_unicode_ci和utf8mb4_general_ci),MySQL无法直接在不同排序规则的字段间执行等值比较操作。
解决方案
1. 临时修复(修改查询语句)
在查询中显式指定其中一个字段的排序规则,强制两者一致,快速解决当前查询问题:
select `upload_transaksi`.`id` from `giisystem_gim`.`upload_transaksi_images` inner join `upload_transaksi` on `upload_transaksi`.`id` = `upload_transaksi_images`.`upload_transaksi_id` inner join `cb_receipt` on `cb_receipt`.`code` COLLATE utf8mb4_unicode_ci = `upload_transaksi`.`code` where `cb_receipt`.`id` = 23355
或者将upload_transaksi.code转换为utf8mb4_general_ci:
select `upload_transaksi`.`id` from `giisystem_gim`.`upload_transaksi_images` inner join `upload_transaksi` on `upload_transaksi`.`id` = `upload_transaksi_images`.`upload_transaksi_id` inner join `cb_receipt` on `cb_receipt`.`code` = `upload_transaksi`.`code` COLLATE utf8mb4_general_ci where `cb_receipt`.`id` = 23355
⚠️ 注意:临时方案仅适合单次验证,频繁使用会导致字段索引失效,影响查询性能。
2. 永久修复(统一字段排序规则)
直接修改其中一个字段的排序规则,让两个字段保持一致,推荐统一使用utf8mb4_unicode_ci(排序更准确,支持多语言场景)。
比如修改upload_transaksi.code的排序规则:
-- 替换xxx为字段实际长度,保留原字段属性(如NOT NULL、DEFAULT等) ALTER TABLE `giisystem_gim`.`upload_transaksi` MODIFY COLUMN `code` VARCHAR(xxx) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
或者修改cb_receipt.code的排序规则:
ALTER TABLE `giisystem_gim`.`cb_receipt` MODIFY COLUMN `code` VARCHAR(xxx) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
⚠️ 操作前建议先备份数据,避免意外。
3. 全局统一(修正数据库/表默认规则)
如果数据库内多个表的默认排序规则不一致,后续新增字段可能重复出现此类问题。
- 查看数据库默认排序规则:
SELECT DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'giisystem_gim';
- 修改数据库默认规则(仅对后续新建的表生效):
ALTER DATABASE `giisystem_gim` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 统一现有表的排序规则(会修改表中所有字符类型字段,需在业务低峰期执行):
ALTER TABLE `giisystem_gim`.`upload_transaksi` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE `giisystem_gim`.`cb_receipt` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
内容的提问来源于stack exchange,提问作者Aliffathur Risqi Hidayat
相关产品推荐
相关产品推荐

