12

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

如果我在 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 单词(如阿拉伯语或日语单词)时才会出现此错误

4

3 回答 3

9

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

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

pg_exec($connection, utf8_encode($query ));
于 2013-03-13T11:41:08.170 回答
2

在较早的帖子上回答,但是,我遇到了类似的情况,在 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)";

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

于 2017-06-23T10:54:03.540 回答
-1

我将无法提交正确的 unicode SQL 查询(用于java的quercus与 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));
于 2015-09-08T10:57:18.330 回答