尝试通过MySQL中的存储过程执行select操作时出现以下错误。
对于操作'=‘,
排序规则(latin1_general_cs,IMPLICIT)和(latin1_general_ci,IMPLICIT)的非法混合
你知道这里可能出了什么问题吗?
表的排序规则为latin1_general_ci
,where子句中列的排序规则为latin1_general_cs
。
发布于 2010-06-13 01:17:22
这通常是由于比较两个不兼容排序规则的字符串或尝试将不同排序规则的数据选择到组合列中而导致的。
子句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
运算符:
二进制字符串是CAST(字符串为二进制)的简写。
您的解决方案可能如下所示:
SELECT * FROM table WHERE BINARY a = BINARY b;
或,
SELECT * FROM table ORDER BY BINARY a;
发布于 2012-06-25 00:56:59
将我的2c添加到对未来谷歌人的讨论中。
我正在调查一个类似的问题,在使用接收varchar参数的自定义函数时,我得到了以下错误:
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and
(utf8_general_ci,IMPLICIT) for operation '='
使用以下查询:
mysql> show variables like "collation_database";
+--------------------+-----------------+
| Variable_name | Value |
+--------------------+-----------------+
| collation_database | utf8_general_ci |
+--------------------+-----------------+
虽然表是使用utf8_unicode_ci定义的,但我能够分辨出DB使用的是utf8_general_ci,
mysql> show table status;
+--------------+-----------------+
| Name | Collation |
+--------------+-----------------+
| my_view | NULL |
| my_table | utf8_unicode_ci |
...
请注意,这些视图具有NULL排序规则。视图和函数似乎都有排序规则定义,即使此查询对一个视图显示为null。使用的排序规则是在创建视图/函数时定义的DB排序规则。
可悲的解决方案是既更改数据库排序规则,又重新创建视图/函数,以强制它们使用当前排序规则。
ALTER DATABASE mydb DEFAULT COLLATE utf8_unicode_ci;
ALTER TABLE utf8_unicode_ci; CONVERT TO字符集utf8 COLLATE mydb
我希望这能对某些人有所帮助。
发布于 2012-11-24 18:36:55
有时转换字符集可能是危险的,特别是在具有大量数据的数据库上。我认为最好的选择是使用“二元”运算符:
e.g : WHERE binary table1.column1 = binary table2.column1
https://stackoverflow.com/questions/3029321
复制相似问题