2014-07-22 82 views
0

的非法搭配我得到了我的應用程序下面的coallation問題,當我嘗試選擇一些地方兩個字符串相等:歸類PHP MYSQL,latin1_swedish_ci和utf8_general_ci

SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' 

在堆棧跟蹤我可以看到參數Lamellt \ xE4ckning這意味着Lamelltäckning,我想我的參數隱式調用latin1_swedish_ci煤化。

我的整個數據庫使用此:

DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci 

當我從PHP插入字符串我只是做一個簡單的插入:

$name = "Lamelltäcke"; 
$db->update("insert into...."); 

的數據,現在我想使用來自一個CSV文件,我不知道我是否可以通過以某種方式設置coallation來解決這個問題,或者如果我需要在某些w中轉換字符串ay

這裏有什麼問題?我該如何解決它?


從PHP插入數據時出現接口問題。我做了PDO連接是這樣的:

$db = new \PDO($dsn, $config->db_user, $config->db_pass, array(\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 

當我這樣定義

$str = "åuuäuuö"; 

在PHP的字符串,並插入它沒有問題。但是,當我收到POST請求字符串,我可以附和出來就好了

"åuuäuuö" 

在數據庫但它現在被插入像

"?uu?uu?" 

mb_detect_encoding($str); 

得到:UTF-8


問題在於字符串本身的編碼。我的數據庫使用UTF-8,但編碼是ISO-8859-x。爲了讓所有的事情變得更糟,我的Java客戶端還有另一種編碼,這使得它很難調試。它被稱爲「引用字符串」。

終於幫助我解決問題的是這段PHP代碼,它接受一個String並將其從所有可能的編碼轉換爲UTF-8並將其打印出來。 Look for a row where your string is printed correctly and there is your encoding of the string.然後,當您獲得正確的編碼時,使用mb_convert_encoding重新編碼您的字符串。

$str = "String of unknown encoding with chars like äåö or something else"; 

foreach(mb_list_encodings() as $chr){ 
      echo mb_convert_encoding($str, 'UTF-8', $chr)." : ".$chr."\r\n"; 
     } 

需要注意的是要確保客戶端也使用正確的編碼。在我的情況下,這是一個Java程序,在正常情況下,這將是您的Web應用程序/瀏覽器和。

回答

1
  • 嘗試你的PHP文件轉換爲UTF8
  • 數據庫連接後立刻進行查詢與SET NAMES 'utf8'

此外,檢查你的領域字符集是UTF8。

+0

我試圖在我的PDO連接中設置這個參數,但它沒有縫隙幫助。謝謝 – user264230

+0

你說,當你收到來自帖子請求的字符串時,插入有問題。什麼是您的網頁上使用的編碼?檢查它是否是UTF-8。 –

+0

你說得對,我應該將字符串轉換爲UTF-8。看看這個問題,如果你想看看這是如何完成:) – user264230

相關問題