我已經有一個UTF-8字符集,並在試圖通過PHP的形式插入到它一個MySQL表,數據庫提供了以下錯誤:UTF-8數據庫問題
PDOStatement::execute(): SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE8' for column ...
中的角色問題是'è',但我不明白爲什麼這應該是一個問題,考慮到數據庫和表設置爲UTF-8。
編輯
我直接從mysql終端嘗試和有同樣的問題。
我已經有一個UTF-8字符集,並在試圖通過PHP的形式插入到它一個MySQL表,數據庫提供了以下錯誤:UTF-8數據庫問題
PDOStatement::execute(): SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE8' for column ...
中的角色問題是'è',但我不明白爲什麼這應該是一個問題,考慮到數據庫和表設置爲UTF-8。
編輯
我直接從mysql終端嘗試和有同樣的問題。
E8比一個字節的UTF8字符的最大可用字符7F更大:
看來你的連接沒有被設置爲UTF-8,但一些其他8位編碼,如ISO拉丁語。如果將數據庫設置爲UTF8,則只更改數據庫在內部使用的字符集,連接可能處於不同的默認值(對於較早版本的MySQL,則爲latin1),因此應在連接到數據庫後嘗試發送初始SET CHARACTER SET utf-8
。如果您有權訪問my.cnf,您也可以在那裏設置正確的默認值,但請記住,更改默認值可能會破壞在同一主機上運行的其他任何網站/應用程序。
謝謝,使用php的utf8_encode()函數解決了問題。 – Danten 2010-04-11 01:20:01
'SET CHARACTER SET'對此不是正確的命令(參見:http://stackoverflow.com/questions/1566602/is-set-character-set-utf8-necessary),它應該是'utf8',而不是'UTF-8'。 @Danten,如果你已經正確設置了所有東西,你不需要使用'utf8_encode()'。 – mercator 2010-04-11 01:33:30
由於某些原因,SET NAMES從未以我們需要的方式在客戶端的某些服務器上運行(在某些服務器上,它似乎根本沒有任何效果)。不幸的是,字符集的命名取決於您使用的分佈。 utf-8在我們部署的所有服務器上都可用,而utf8有時未知。但是,由於我們必須支持一些奇怪的託管網站空間,其中一些網站可能安裝了錯誤的設置。在任何情況下,如果在部署時必須快速進行更改,至少應該將字符集(也可能是命令本身)保存在配置文件中。 – Energiequant 2010-04-11 10:18:49
您的數據庫可能設置爲UTF-8,但數據庫連接也需要設置爲UTF-8。你應該用SET NAMES utf8
聲明來做到這一點。您可以使用PDO的driver_options
有它執行,一旦你連接:
$handle = new PDO("mysql:host=localhost;dbname=dbname",
'username', 'password',
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
看一看關於確保你的整個網站的以下兩個鏈接,瞭解更多詳細信息,使用UTF-8恰當:
爲了將來的參考,我做到了。問題是多字節字符串。 – Danten 2010-04-11 01:30:44
的值傳遞給MySQL中,你可以使用之前下面的代碼:
$val = mb_check_encoding($val, 'UTF-8') ? $val : utf8_encode($val);
轉換字符串爲UTF-8,如果它是物質的唯一一個領域。
在提出您的查詢之前,您是否嘗試過mysql_query('SET NAMES UTF-8')? – Tom 2010-04-11 01:06:35
是的,我試過了(它是UTF8,不是UTF-8 btw :) – Danten 2010-04-11 01:20:56
關於你的評論的另一個想法如下:你確定用於發送表單的字符集是UTF-8(客戶端;用XML編碼設置或頭/元屬性,也可能由