我得到下面的错误时,试图做一个选择通过一个存储过程在MySQL。
操作'='的排序规则(latin1_general_cs,IMPLICIT)和(latin1_general_ci,IMPLICIT)的非法混合
你知道哪里出了问题吗?
该表的排序规则为latin1_general_ci, where子句中的列的排序规则为latin1_general_cs。
我得到下面的错误时,试图做一个选择通过一个存储过程在MySQL。
操作'='的排序规则(latin1_general_cs,IMPLICIT)和(latin1_general_ci,IMPLICIT)的非法混合
你知道哪里出了问题吗?
该表的排序规则为latin1_general_ci, where子句中的列的排序规则为latin1_general_cs。
当前回答
这段代码需要放在运行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。
其他回答
排序规则问题的另一个来源是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_connection和mysql.proc。character_set_client列。
我个人在一次手术中遇到过这个问题。 如果你不想改变表,你可以尝试将你的参数转换为过程。 我已经尝试了几次使用collate(与一个集到选择),但没有一个适合我。
CONVERT(my_param USING utf32)做到了这一点。
这通常是由于比较两个排序规则不兼容的字符串或试图将不同排序规则的数据选择到一个组合列中而导致的。
子句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操作符:
二进制str是CAST(str AS BINARY)的简写。
你的解决方案可能是这样的:
SELECT * FROM table WHERE BINARY a = BINARY b;
or,
SELECT * FROM table ORDER BY BINARY a;
请记住,正如Jacob Stamm在评论中指出的那样,“转换列来进行比较将导致忽略该列上的任何索引”。
关于整理业务的更多细节,我强烈推荐eggyal对这个问题的出色回答。
下面的方法对我很有效。
CONVERT( Table1.FromColumn USING utf8) = CONVERT(Table2.ToColumn USING utf8)
在我的例子中,函数的默认返回类型是来自数据库的类型/排序规则(utf8mb4_general_ci),但数据库列是ascii。
WHERE ascii_col = md5(concat_ws(',', a,b,c))
权宜之计是
WHERE ascii_col = BINARY md5(concat_ws(',', a,b,c))