尝试通过 MySQL 中的存储过程进行选择时出现以下错误。
操作 '=' 的排序规则 (latin1_general_cs,IMPLICIT) 和 (latin1_general_ci,IMPLICIT) 的非法混合
知道这里可能出了什么问题吗?
表的排序规则是latin1_general_ci
where 子句中的列是latin1_general_cs
.
这通常是由于比较两个排序规则不兼容的字符串或尝试将不同排序规则的数据选择到组合列中而引起的。
该条款COLLATE
允许您指定查询中使用的排序规则。
例如,以下WHERE
子句将始终给出您发布的错误:
WHERE 'A' COLLATE latin1_general_ci = 'A' COLLATE latin1_general_cs
您的解决方案是为查询中的两列指定共享排序规则。这是一个使用的示例COLLATE
clause:
SELECT * FROM table ORDER BY key COLLATE latin1_general_ci;
另一种选择是使用BINARY
操作员:
BINARY 星号是 CAST(string AS BINARY) 的简写。
您的解决方案可能如下所示:
SELECT * FROM table WHERE BINARY a = BINARY b;
or,
SELECT * FROM table ORDER BY BINARY a;
请记住,正如 Jacob Stamm 在评论中指出的那样,“转换列来比较它们将导致该列上的任何索引被忽略”。
有关此整理业务的更多详细信息,我强烈推荐Eggyal 对同一问题的出色回答 https://stackoverflow.com/a/21061305/120990.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)