2014-03-06 130 views
1

我有一個表有以下的列:與PDO插入數據 - 錯誤UTF8

users( id SERIAL, username VARCHAR(20), password VARCHAR(64), salt VARCHAR(32), name VARCHAR(50), joined TIMESTAMP WITHOUT TIME ZONE, grupo INTEGER )

數據庫編碼是UTF8。

PDO連接:

private function __construct(){ 
     try{ 
      $this->_pdo = new PDO('pgsql:host=' . Config::get('pgsql/host') . ';port=' . Config::get('pgsql/port') . ';dbname=' . Config::get('pgsql/db') . ';user=' . Config::get('pgsql/username'). ';password=' . Config::get('pgsql/password')); 
      $this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     }catch(PDOException $e){ 
      die($e->getMessage()); 
     } 
    } 

我使用的PDO,然後我的腳本如下,插入數據:

public function query($sql, $params = array()){ 
     $this->_error = false; 
     if($this->_query = $this->_pdo->prepare($sql)){ 
      $this->_query->execute($params); 
     } 
} 

傳遞的SQL如下:

INSERT INTO users(username, password, salt, name, joined, grupo) VALUES(?, ?, ?, ?, ?, ?) 

而通過的陣列是:

Array (   [0] => nath 
        [1] => 81033b63c09fd9104977fdb0ef70b5dc627fd9a6e90d0d400706603def8c22a6 
        [2] => KwjWC57AO0Gh1VvSUuJpDMNkEiraBzFL 
        [3] => Nathália 
        [4] => 2014-03-06 19:35:01 
        [5] => 1) 

當我運行它,我得到以下錯誤:

SQLSTATE[22021]: Character not in repertoire: 7 ERRO: invalid byte sequence invalid for UTF encode. "UTF8": 0xe1 0x6c 0x69 

PS:如果我鍵入Nathalia,而不是Nathália它完美的作品。

試圖找出發生了什麼事情,我通過域插入場,就像這樣:

if($this->_query = $this->_pdo->prepare("INSERT INTO users(username) VALUES(?)"){ 
      $this->_query->execute(array('nath')); 
} 

而且它的工作確定。然後,我用passwordarray('nath')替換爲username,其中array('81033b63c09fd9104977fdb0ef70b5dc627fd9a6e90d0d400706603def8c22a6')和其他字段的值相同。

當我按字段插入字段時,一切都很完美。任何線索發生了什麼?

+0

你的'PDO'構造函數是什麼樣的?在連接之後添加了'charset'參數還是運行了'SET NAMES'(在任何人聲明這是Postgres而不是MySQL之前,它們支持相同的連接字符集參數)?看到這個答案 - http://stackoverflow.com/a/18250296/283366 – Phil

+0

@Phil我會加在那裏 – ahmm95

+0

可能的重複[如何在PHP PgSQL數據庫的PDO類構造函數中設置UTF-8](http:// stackoverflow.com/questions/18250167/how-set-utf-8-in-pdo-class-constructor-for-php-pgsql-database) – Phil

回答

2

該錯誤消息是特定有關該問題:

0xe1 0x6c 0x69

0xe1是在ISO-8859-1 á,不以UTF-8。

其他兩個字節表示US-ASCII範圍(li)中的字符,因此它們在iso-8859-1和utf-8中共享相同的字節表示形式。

您的腳本正在發送iso-8859-1編碼文本而不是utf-8編碼文本。你應該詢問你從哪裏得到Nathália字符串,以及它應該如何編碼。

如果它應該在utf-8那麼它是該字符串生產者的錯誤。如果它應該採用ISO拉丁文,那麼在將其提供給utf-8數據庫連接之前,您的腳本必須對其應用utf8_encode