非法混合sortingMySQL错误

处理大量数据时出现这个奇怪的错误…

Error Number: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' SELECT COUNT(*) as num from keywords WHERE campaignId='12' AND LCASE(keyword)='hello again 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€' 

我能做些什么来解决这个问题? 我可以以某种方式逃避string,所以这个错误不会发生,或者我需要改变我的表编码莫名其妙,如果是这样,我应该改变它?

 SET collation_connection = 'utf8_general_ci'; 

那么你的数据库

 ALTER DATABASE your_database_name CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

MySQL在那里潜行瑞典有时没有明智的理由。

您应该将您的表格编码和连接编码设置为UTF-8

 ALTER TABLE keywords CHARACTER SET UTF8; -- run once 

 SET NAMES 'UTF8'; SET CHARACTER SET 'UTF8'; 

我有我的表最初创build与CHARSET = latin1 。 表格转换为utf8后,有些列没有被转换,但是这并不是很明显。 你可以尝试运行SHOW CREATE TABLE my_table; 并查看哪些列没有被转换,或者只是在有问题的列上使用下面的查询修复不正确的字符集(根据您的需要更改varchar length和CHARSET和COLLATE):

  ALTER TABLE `my_table` CHANGE `my_column` `my_column` VARCHAR(10) CHARSET utf8 COLLATE utf8_general_ci NULL; 

一般来说,最好的方法是更改​​表格sorting规则。 然而,我有一个旧的应用程序,并不真正能够估计这是否有副作用的结果。 所以我试着把string转换成解决sorting问题的其他格式。 我发现工作是通过将string转换为它的字符的hex表示来进行string比较。 在数据库上,这是用HEX(column). 对于PHP,你可以使用这个函数:

 public static function strToHex($string) { $hex = ''; for ($i=0; $i<strlen($string); $i++){ $ord = ord($string[$i]); $hexCode = dechex($ord); $hex .= substr('0'.$hexCode, -2); } return strToUpper($hex); } 

在执行数据库查询时,必须首先将原始UTF8string转换为一个isostring(例如,在PHP中使用utf8_decode() ),然后才能在数据库中使用该string。 由于整理types数据库内部不能有UTF8字符所以比较应该工作事件虽然这改变了原来的string(转换UTF8字符是不存在的ISO字符集结果?或完全删除)。 只要确保将数据写入数据库时​​,即使用相同的UTF8进行ISO转换。