2009-06-17 45 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;