2010-04-11 81 views
4

我已經有一個UTF-8字符集,並在試圖通過PHP的形式插入到它一個MySQL表,數據庫提供了以下錯誤:UTF-8數據庫問題

PDOStatement::execute(): SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE8' for column ...

中的角色問題是'è',但我不明白爲什麼這應該是一個問題,考慮到數據庫和表設置爲UTF-8。

編輯

我直接從mysql終端嘗試和有同樣的問題。

+0

在提出您的查詢之前,您是否嘗試過mysql_query('SET NAMES UTF-8')? – Tom 2010-04-11 01:06:35

+0

是的,我試過了(它是UTF8,不是UTF-8 btw :) – Danten 2010-04-11 01:20:56

+0

關於你的評論的另一個想法如下:你確定用於發送表單的字符集是UTF-8(客戶端;用XML編碼設置或頭/元屬性,也可能由

)強制執行? PHP可能會或可能不會在內部使用UTF-8(php.ini),但在某些服務器上,您不允許動態更改該字符集。如果PHP使用一些8位字符集,它仍然應該將您的UTF-8編碼文本傳遞給數據庫(mysql_real_escape_string取決於數據庫字符集),但PHP可能需要utf8_decode/utf8_encode字符串操作。 – Energiequant 2010-04-11 10:30:40

回答

1

E8比一個字節的UTF8字符的最大可用字符7F更大:​​

看來你的連接沒有被設置爲UTF-8,但一些其他8位編碼,如ISO拉丁語。如果將數據庫設置爲UTF8,則只更改數據庫在內部使用的字符集,連接可能處於不同的默認值(對於較早版本的MySQL,則爲latin1),因此應在連接到數據庫後嘗試發送初始SET CHARACTER SET utf-8。如果您有權訪問my.cnf,您也可以在那裏設置正確的默認值,但請記住,更改默認值可能會破壞在同一主機上運行的其他任何網站/應用程序。

+1

謝謝,使用php的utf8_encode()函數解決了問題。 – Danten 2010-04-11 01:20:01

+0

'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

+0

由於某些原因,SET NAMES從未以我們需要的方式在客戶端的某些服務器上運行(在某些服務器上,它似乎根本沒有任何效果)。不幸的是,字符集的命名取決於您使用的分佈。 utf-8在我們部署的所有服務器上都可用,而utf8有時未知。但是,由於我們必須支持一些奇怪的託管網站空間,其中一些網站可能安裝了錯誤的設置。在任何情況下,如果在部署時必須快速進行更改,至少應該將字符集(也可能是命令本身)保存在配置文件中。 – Energiequant 2010-04-11 10:18:49

2

您的數據庫可能設置爲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恰當:

+0

爲了將來的參考,我做到了。問題是多字節字符串。 – Danten 2010-04-11 01:30:44

1

的值傳遞給MySQL中,你可以使用之前下面的代碼:

$val = mb_check_encoding($val, 'UTF-8') ? $val : utf8_encode($val);

轉換字符串爲UTF-8,如果它是物質的唯一一個領域。

+0

你絕對應該避免這樣做!檢查什麼是編碼正在消耗並且並不總是精確的:最好嘗試通過其他方式知道編碼實際是什麼(如果你不是不幸的是沒有線索,它經常被提及,甚至有時多倍)。 – JeromeJ 2013-08-13 21:10:26

+0

是的,你說得對。提到的是解決問題的快速解決方案。你應該通過使用Mysql來解決這個問題 – purab 2013-08-18 13:33:33