Postgresql PHP неверная последовательность байтов для кодирования UTF8

У меня есть простой синтаксис 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\"

Итак, я попытался установить NAMES и client_encoding из PHP (PDO), но все равно имею ту же проблему

$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, например, арабское или японское слово

Ответ 1

Попробуйте кодировать в utf-8 с помощью utf8_encode().

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

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

Ответ 2

Отвечая на более старую должность, но у меня была аналогичная ситуация, во время импорта CSV я заметил ошибку: invalid byte sequence for encoding "UTF 8": 0x95 in ....

Я исправил ошибку, просто переведя кодировку из Windows-1252 в UTF-8 в PHP, используя: 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)";

Надеюсь, это поможет кому-то.

Ответ 3

Я не могу отправить правильный SQL-запрос Юникода ( quercus для java изменяет плохую работу из юникода и все вроде "SET NAMES UTF8"; "no working" ), и я разрешаю это из преобразования 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));