2012-10-05 31 views
6

我正在使用PHP解析一些數據並將其放入MySQL中。但是,如果數據中包含特殊字符,如êm-Khê MySQL是輸出以下錯誤:如何使用PHP解析特殊字符到MySQL?

SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xEAm-Kh\xEA...' 

後我測試,MySQL是沒有問題的。 (表和列整理是utf8_general_ci)當我直接(手動)將êm-Khê字符串插入表中時,它會進入它。所以MySQL可以接受這些數據。

因此,任何想法爲什麼它在PHP級別有這個錯誤?

我不明白,並且對編碼知識有很好的瞭解。

  • 爲什麼在查詢中將ê轉換爲\xEA

因此,當我得到像ê這樣的數據,我怎麼能把它放入數據庫,因爲它是ê不變?

+1

您可以發佈正在執行數據庫插入的代碼 –

+1

[在Web應用程序中處理Unicode前後](http://kunststube.net/frontback/)。 – DCoder

回答

3

所以問題是你的db連接不是UTF8,但可能是LATIN1,所以你必須在連接數據庫後使用PHP的函數utf8_encode()或執行SET NAMES utf8

$handle = new PDO("mysql:host=localhost;dbname=dbname", 
'username', 'password', 
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 

This thread有一些很好的參考和解釋

+0

PDO?對不起,我沒有得到你的意思。我正在使用'mysql_connect'。這不是那樣的。 –

+1

哦,好吧,我通過使用php'utf8_encode()'方法得到它。謝謝x) –

+0

在5.3.6之後你應該使用'; charset = utf8'作爲連接字符串的一部分,這很好。 –

0

我的猜測是PHP和MySQL之間存在編碼不匹配。 ê並沒有真正轉化爲\xEA,只是MySQL不知道字節序列EA應該是什麼,因此只是抱怨原始字節錯誤。您需要先了解PHP中字符串的編碼方式;這取決於他們來自哪裏。然後你需要設置正確的MySQL連接編碼,所以MySQL知道你發送它的字符串是什麼編碼。怎麼做取決於你連接到數據庫的方式。

查看Handling Unicode Front To Back In A Web App瞭解整個過程。

+0

嗨,PHP中字符串的源編碼是'utf-8',它來自XML。我的意思是,XML編碼爲「utf-8」。 –

+0

然後仔細檢查在你發送到數據庫的查詢上使用'bin2hex',並檢查你的連接編碼設置爲什麼。 – deceze

-1

您可以使用此功能。 mysql_real_escape_string($ user), mysql_real_escape_string($ password));