今天使用 Mysql 做关联查询时,报错如下:
Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='
背景描述:
我们有两张表,Table_1 和 Table_2,
其中 Table_1 建表时,指定了 charset 和 collate:
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
而 Table_2 建表时,指定了 charset ,但没有指定 collate:
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
在MySQL中,如果你在创建数据库或者表的时候没有指定collation,那么MySQL会使用默认的collation。对于字符串字段(CHAR, VARCHAR, TEXT),如果没有指定collation,MySQL也会使用默认的collation。
我们通过以下SQL语句查询MySQL的默认collation:
SHOW VARIABLES LIKE 'collation_%';
查询出的结果为:
所以有了报错中的 utf8mb4_unicode_ci
与 utf8mb4_general_ci
编码格式不一致的错误。
解决方法
方法1. 统一表的编码格式。
ALTER TABLE Table_2 COLLATE=utf8mb4_unicode_ci;
方法2. 转换格式
- 例子1:
关联Table_1
、Table_2
的两个字段查询。
select t1.`a` , t1.`b`,t2.`c` from `Table_1` t1, `Table_2` t2
where t1.`a` = CONVERT(t2.`a` using utf8);
- 例子2:
从Table_2
中取出一组a
值,查询出Table_1
中字段a
不在这组值中的记录。
select * from Table_1 where
`a` not in (select convert(`a` using utf8) from `Table_2` WHERE `b` > 1);
以上就是 Illegal mix of collations … 问题的全部内容,感谢阅读!