在mysql中解决“Illegal mix of collations”错误的故障排除

285
当尝试通过MySQL存储过程执行Select语句时,出现以下错误:

Illegal mix of collations (latin1_general_cs,IMPLICIT) and (latin1_general_ci,IMPLICIT) for operation '='

请问这可能是什么问题?
表的排序规则是latin1_general_ci,而where子句中列的排序规则是latin1_general_cs

你可以尝试使用这个脚本,将你的所有数据库和表转换为utf8编码。 - Mirat Can Bayrak
3
我使用各种数据库已经有很长时间了(自1990年以来),使用MySQL的排序规则和强制性转换方式显得“疯狂”,因为数据库解决问题是通过将“一个”字符集强制应用于整个数据库,然后由导入/导出过程来转换成/从数据库所使用的唯一字符集。 MySQL选择的解决方案是一种破坏性的方案,因为它将“应用程序问题”(字符集转换)与数据库问题(排序规则的使用)混合在一起。 为什么不从数据库中“移除”这些繁琐和愚蠢的功能,使其更加易于使用和可控。 - Maurizio Pievaioli
18个回答

1

0

字符集问题的另一个来源是 mysql.proc 表。请检查您的存储过程和函数的字符集:

SELECT
  p.db, p.db_collation, p.type, COUNT(*) cnt
FROM mysql.proc p
GROUP BY p.db, p.db_collation, p.type;

同时注意到 mysql.proc.collation_connectionmysql.proc.character_set_client 这两列。

0
在我的情况下,函数的默认返回类型是数据库的类型/排序规则(utf8mb4_general_ci),但数据库列是ASCII。
WHERE ascii_col = md5(concat_ws(',', a,b,c))

快速修复是

WHERE ascii_col = BINARY md5(concat_ws(',', a,b,c))

0

我使用了ALTER DATABASE mydb DEFAULT COLLATE utf8_unicode_ci;,但是没有起作用。

在这个查询中:

Select * from table1, table2 where table1.field = date_format(table2.field,'%H');

这对我有用:

Select * from table1, table2 where concat(table1.field) = date_format(table2.field,'%H');

是的,只需要一个 concat


检查您的表和列的排序规则(使用show table status; 和 show full columns from table1;)。如果表已经使用错误的排序规则创建,则使用alter database无法起作用。 - Ariel T
1
修改数据库mydb的默认排序规则...对我有用,请点赞。也许我有优势,因为我可以删除和重新创建数据库,并从备份中加载。 - tobixen

0

0
我个人在一个过程中遇到了这个问题。 如果您不想使用alter table,可以尝试将参数转换为过程。 我尝试了几种使用collate(在select中设置)的方法,但都没有成功。

CONVERT(my_param USING utf32)解决了问题。


0

我比较了两个数据库的字段。一个使用utf8,另一个使用utf8mb4。我注意到只有将COLLATE设置为utf8mb4(我使用了utf8mb4_unicode_ci)才能正常工作。尝试使用utf8_unicode_ci会产生错误。

总的来说:当比较具有不同字符集的字符串时,可能只有其中一个适用于COLLATE命令。


-3

这段代码需要放在运行 SQL 查询/查询的数据库中

SQL 查询窗口

ALTER TABLE `table_name` CHANGE `column_name` `column_name`   VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL;

请将 table_name 和 column_name 替换为适当的名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接