2013-03-06 6 views
10

У меня есть простой синтаксис SQL для вставки в таблицу. Я использую Postgresql 8.4 и уже установил кодировку базы данных UTF8 и POSIX для сортировки и типа символов.Postgresql Неверная последовательность байтов PHP для кодирования UTF8

Запрос прекрасен, если я запустил его под 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\" 

Так я попытался установить ИМЕНА и 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 как арабский или японский слово

+0

Вы можете установить всю вашу кодировку ссылок/базы данных для использования utf-8, но если исходная строка не кодируется utf-8, она все равно вызовет ошибку. – datasage

+0

Не могли бы вы отправить результат 'SHOW client_encoding;' из pgAdmin? – Houari

+1

Пожалуйста, покажите односимвольный ввод и соответствующую последовательность байтов из отчета об ошибке (например, '0xd85b'). Вы также должны сообщить нам, что такое стандартная текстовая кодировка вашей операционной системы; если вы не знаете, запустите команду 'locale', если вы находитесь в Linux/unix. Не зная исходную кодировку и оригинальный текст, трудно сказать много. –

ответ

4

Try кодировать в UTF-8 с utf8_encode().

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

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

Кодирование всего запроса кажется странным. (Кроме того, ваш пример SQL может быть короче и правильнее написано :) –

-1

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

Отвечая на старой должности, но я просто была подобная ситуация, при импорте 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)"; 

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

Смежные вопросы