我有一個表有以下的列:與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'));
}
而且它的工作確定。然後,我用password
和array('nath')
替換爲username
,其中array('81033b63c09fd9104977fdb0ef70b5dc627fd9a6e90d0d400706603def8c22a6')
和其他字段的值相同。
當我按字段插入字段時,一切都很完美。任何線索發生了什麼?
你的'PDO'構造函數是什麼樣的?在連接之後添加了'charset'參數還是運行了'SET NAMES'(在任何人聲明這是Postgres而不是MySQL之前,它們支持相同的連接字符集參數)?看到這個答案 - http://stackoverflow.com/a/18250296/283366 – Phil
@Phil我會加在那裏 – ahmm95
可能的重複[如何在PHP PgSQL數據庫的PDO類構造函數中設置UTF-8](http:// stackoverflow.com/questions/18250167/how-set-utf-8-in-pdo-class-constructor-for-php-pgsql-database) – Phil