mysql - 解决mysql中的 "Illegal mix of collations"错误

标签 mysql collation

尝试通过 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/

相关文章:

mysql - 如何对不区分大小写的 MySQL 数据库执行区分大小写的搜索?

sql-server - Oracle 中与 SQL Server 中的 Latin1_General_BIN 排序规则类型等效的排序规则类型是什么?

mysql - 计算一条SQL记录占用的空间

mysql - Node API 可以构建在 MySQL 数据库之上吗?

MySQL 整理查询结果

php - 使用 UTF-8 时某些字符无法显示

postgresql - 如何设置分隔符,Postgresql

PHP MySQL 查询参数化问题

php - 如果 PHP 不存在,则插入一条 SQL 记录

php - 如何在 PHP 中获取受 MySQL 查询影响的行?