使用PDO插入数据 - 错误UTF8

时间:2014-03-06 23:45:37

标签: php sql postgresql pdo

我有一个包含以下列的表:

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'));
}

它运作正常。然后,我将username替换为password,将array('nath')替换为array('81033b63c09fd9104977fdb0ef70b5dc627fd9a6e90d0d400706603def8c22a6'),将其他字段替换为{{1}}。

当我逐字段插入时,一切都很完美。发生了什么事情的线索?

1 个答案:

答案 0 :(得分: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-latin,那么您的脚本必须先将utf8_encode应用于它,然后再将其提供给utf-8数据库连接。