Postgresql PHP无效字节序列,用于编码UTF8

时间:2013-03-06 16:05:00

标签: php postgresql pdo

我有一个简单的SQL语法用于插入表。我正在使用Postgresql 8.4并且已经将数据库编码设置为UTF8,将POSIX设置为Collat​​ion和Character类型。

如果我在pgadmin3下运行它,查询就可以了,但如果我在PHP中执行,则会出错。

"Internal Server Error: SQLSTATE[22021]:
Character not in repertoire: 7 ERROR: 
invalid byte sequence for encoding \"UTF8\": 0xd85b\nHINT:
This error can also happen if the byte sequence does not match the encoding expected by the server,
which is controlled by \"client_encoding\"

所以我试图从PHP(PDO)设置NAMES和client_encoding,但仍然有同样的问题

$instance->exec("SET client_encoding = 'UTF8';");
$instance->exec("SET NAMES 'UTF8';");

pg_set_client_encoding($link, "UNICODE");如果我使用的是本机postgresql驱动程序pg_pconnect,我的工作正常,但目前我正在使用PDO作为驱动程序。

我也已设置mb_internal_encoding('UTF-8');

还有其他方法可以解决这个问题吗?

此错误仅在我尝试插入非阿拉伯语或日语单词

等非ascii字词时出现

3 个答案:

答案 0 :(得分:7)

尝试使用utf8_encode()编码为utf-8。

$query = "INSERT INTO student (id, firstName, lastName, age) VALUES (1, 'myFisrtName', 'myLastName', 23)";

pg_exec($connection, utf8_encode($query ));

答案 1 :(得分:1)

回答一篇较旧的帖子,但我刚刚遇到类似的情况,在CSV导入过程中,我注意到了错误: invalid byte sequence for encoding "UTF 8": 0x95 in ....

我通过使用以下方法将PHP中的编码从Windows-1252转换为UTF-8来修复错误: mb_convert_encoding($fieldValue,'UTF-8','Windows-1252')

    $query = "INSERT INTO student 
              (id, firstName, lastName, age) 
              VALUES 
              (1, '".mb_convert_encoding($firstName,'UTF-8','Windows-1252')."', 
                  '".mb_convert_encoding($lastName,'UTF-8','Windows-1252')."', 23)";

希望这会对某人有所帮助。

答案 2 :(得分:-1)

我将无法提交正确的unicode SQL查询( quercus 用于 java 改变unicode的糟糕工作,并且所有类似“SET NAMES'UTF8'; “没有用,”我从 Base64转换

解决了这个问题
$name_enc = base64_encode($name);       
$res = $db->prepare(
            'INSERT INTO "MyTable"("ID", "Name") VALUES
               (   nextval(\'gen_addresses\'), 
                   convert_from(decode(?, \'base64\'), \'UTF8\'));' 
     )->execute(array($name_enc));