2009-06-17 46 views
80

我得到这个奇怪的错误,同时处理大量数据的非法混合...归类MySQL错误

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 昔 ã‹ã‚‰ ã‚ã‚‹ å ´æ‰€' 

我能做些什么来解决这个问题?我可以以某种方式逃避字符串,所以不会出现此错误,或者我需要以某种方式更改我的表编码,如果是这样,我应该将其更改为?

+0

这个错误,这是一个注射或不是? – 2017-01-26 11:39:19

回答

192
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在那里偷偷瑞典有时没有合理的理由。

+2

作品像一个魅力:) – 2012-11-28 19:25:16

+1

梦幻般的朋友。它工作得很好。谢谢。 – Sagotharan 2013-03-14 10:31:24

8

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

ALTER TABLE keywords CHARACTER SET UTF8; -- run once 

SET NAMES 'UTF8'; 
SET CHARACTER SET 'UTF8'; 
-1

一般来说,最好的办法就是更改表的排序规则。然而,我有一个旧的应用程序,并不真正能够估计结果是否有副作用。因此,我尝试以某种方式将字符串转换为解决整理问题的其他格式。 我发现的工作是通过将字符串转换为其字符的十六进制表示来进行字符串比较。在此与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); 
} 

在做数据库查询,你原来的UTF8字符串必须先转换成ISO字符串(例如,使用PHP utf8_decode())使用前它在DB中。由于排序规则类型,数据库内部不能有UTF8字符,因此比较应该工作,尽管这会更改原始字符串(将不会在ISO字符集结果中出现的UTF8字符转换为?或完全删除)。只要确保将数据写入数据库时​​,即使用相同的UTF8转换为ISO。

0

我有我的表最初创建与CHARSET = latin1。表格转换为utf8某些列未转换,但这并不明显。 你可以尝试运行SHOW CREATE TABLE my_table;,看看哪列并没有被转化或刚修好不正确的字符与下面的查询问题列设置(改变VARCHAR长度和字符集和整理根据您的需要):下面的语句

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

使用对于错误

如果数据在表中,请注意您的数据获取备份。

 ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;