尝试通过 MySQL 中的存储过程进行选择时出现以下错误。
Illegal mix of collations (latin1_general_cs,IMPLICIT) and (latin1_general_ci,IMPLICIT) for operation '='
知道这里可能出了什么问题吗?
表的排序规则是latin1_general_ci
,where子句中列的排序规则是latin1_general_cs
。
最佳答案
这通常是由于比较两个排序规则不兼容的字符串或试图将不同排序规则的数据选择到组合列中造成的。
COLLATE
子句允许您指定查询中使用的排序规则。
例如,以下 WHERE
子句将始终给出您发布的错误:
WHERE 'A' COLLATE latin1_general_ci = 'A' COLLATE latin1_general_cs
您的解决方案是为查询中的两列指定共享排序规则。下面是一个使用 COLLATE
子句的示例:
SELECT * FROM table ORDER BY key COLLATE latin1_general_ci;
另一种选择是使用 BINARY
运算符:
BINARY str is the shorthand for CAST(str AS BINARY).
您的解决方案可能如下所示:
SELECT * FROM table WHERE BINARY a = BINARY b;
或者,
SELECT * FROM table ORDER BY BINARY a;
请记住,正如 Jacob Stamm 在评论中指出的那样,“转换列来比较它们将导致忽略该列上的任何索引”。
有关此整理业务的更多详细信息,我强烈推荐 eggyal's excellent answer to this same question .
关于mysql - 解决mysql中的 "Illegal mix of collations"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34399051/