更新时间:2026-03-19 GMT+08:00
视图或者查询报错illegal mix of collation
该报错常见于varchar等字符类型的列之间,或是这类字符列与字面量字符串(即SQL中直接输入的字符串)的比较,报错的原因是比较符号两边字符串的排序集(collation)不一致。
例如:
SELECT … WHERE (Column_Name = convert(date_format(curdate(),'%Y%m%d') using utf8mb4) …FROM Table_Name;
SELECT … WHERE (Column_Name=‘AAAAA’) …FROM Table_Name;
可以使用MySQL内置的COLLATION()函数,查看比较符号左右的表达式是否一致。
- 使用COLLATION()函数查看表中某一字符类型列的排序集。
SELECT COLLATION(column_name) FROM Table_Name LIMIT 1;
- 使用COLLATION()函数查看常量或表达式的排序集。
SELECT COLLATION(‘AAA’);
SELECT COLLATION(convert(date_format(curdate(),'%Y%m%d') using utf8mb4));
当比较符号两边的字符collation不一致时,建议使用convert函数显式指定排序集直接调整其中一方的collation。由于直接convert表中字段可能会让索引失效,一般情况下建议优先修改常量。
如果
SELECT COLLATION(column_name) FROM Table_Name LIMIT 1;
结果为utf8mb4_general_ci。
SELECT COLLATION(‘AAAAA’);
结果为utf8mb4_0900_ci。
则需要将常量的字符串变为convert(‘AAAAA’using utf8mb4 )collate utf8mb4_general_ci。
SQL变为:
SELECT … WHERE (column_name = convert(‘AAAAA’ using utf8mb4 )collate utf8mb4_general_ci) …FROM Table_Name;