2014-05-15 24 views
4

我使用PHP 5.5,當我嘗試在MySQL數據庫中插入UTF-8字符時,PDO在第一個非ASCII字符處將其切斷。PDO切斷UTF-8字符的字符串

我已經設置我的連接是:

(DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASS, array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING)) 

我已經試過了SET NAMES每個人的職位,但是,這並不工作,要麼是因爲問題不在於對事物的MySQL的一面。

當我通過phpMyAdmin插入並直接從MySQL控制檯執行插入操作時! 當我用PDO選擇重音字符串時,它可以工作!

此問題僅在INSERTUPDATE上使用了PDO!

這是表的SQL。這是所有在UTF-8,但設置和PDO

CREATE TABLE IF NOT EXISTS `mytable` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `id_lang` int(11) NOT NULL DEFAULT '2', 
    `id_tgroup_cat` int(11) NOT NULL, 
    `fieldfor` int(11) NOT NULL, 
    `colors` varchar(100) NOT NULL, 
    `text` text NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=34 ; 

我已經試圖讓文本varchar字段,但這並沒有改變任何東西之間的衝突也許有人知道。

實際插在PHP中:

$query = $this->db->prepare("UPDATE mytable 
            SET text = ?, 
             colors = ? 
            WHERE id = ?"); 
    $query->execute(array($text, $colors, $id)); 

$text = "référence"(只保存在數據庫中的字母R,但沒有口音節省一切)和$顏色是用於測試目的,一個空字符串和$id2

+0

'var_dump($ text)'yield'string(11)「référence」'? –

+0

是的,它確實是。 –

+0

在這個問題上也試過了解決方案@MarcusAdams - 沒有成功。傑克可能會做些什麼。 –

回答

3

這是關鍵的線索對我說:

其中$文字=「參考」(僅在數據庫中保存的字母R,但 沒有口音節省一切)和$顏色爲空字符串 出於測試目的和$ id是2.

聽起來像這是一個UTF-8編碼問題。雖然數據庫是UTF-8,但從代碼到數據庫的整個鏈(包括連接)應該是UTF-8清理。

$this->db->prepare究竟與PHP連接MySQL有什麼關係?從你顯示的代碼中有點不清楚。但是,根據您展示什麼,也許調整您的查詢像這樣將有助於:

$query = $this->db->prepare("SET collation_connection = utf8_bin; 
          SET NAMES utf8; 
          UPDATE mytable 
           SET text = ?, 
            colors = ? 
           WHERE id = ?"); 

或者,也許這樣的:

$this->db->exec("SET collation_connection = utf8_bin; SET NAMES utf8;"); 
$query = $this->db->prepare("UPDATE mytable 
           SET text = ?, 
            colors = ? 
           WHERE id = ?"); 

注意我強制另外的SET collation_connection = utf8_bin;以及SET NAMES utf8;

一般來說,您需要確保從連接,數據庫到表格的整個鏈路都是UTF8清理。我有一個詳細的答案a similar question here

但在你的情況,檢查實際的MySQL服務器my.cnf文件。可以這樣操作的整個鏈條爲UTF-8:

[client] 
default-character-set=utf8 

[mysql] 
default-character-set=utf8 

[mysqld] 
collation-server = utf8_unicode_ci 
init-connect='SET NAMES utf8' 
character-set-server = utf8 

編輯:而且,由於原來的海報指示數據是從HTML5表單來的,我也覺得檢查BOM(字節順序標記)爲實際的HTML5文件本身也會有所幫助。它應該設置爲UTF8。有關what a BOM is are over here的更多詳細信息。具體地從馬丁代碼接受的答案這解釋:

的UTF-8 BOM是一個字節序列(EF BB BF),其允許讀者 來識別文件作爲UTF-8文件。

+0

正如在OP中所述,這是行不通的(並且有更好的方式通過PDO來做到這一點) - 它顯然是一個UTF8不匹配 - 我只需要弄清楚爲什麼:) –

+1

@MrJack請檢查我的最新編輯。如果這沒有幫助,那就夠公平了。但是,從帖子中遺漏的一件事是清楚瞭解這些字符串首先設置的位置。他們來自一個表格嗎?文件是否與BOM一起保存爲UTF8?有關這方面的更多細節將有所幫助。 – JakeGould

+0

嗨,是的,他們來自一個HTML5格式的字符集指定爲第一個元標記。 - 現在去檢查配置文件和你的其他答案。 –