Ответ 1
Попробуйте кодировать в utf-8 с помощью utf8_encode().
$query = "INSERT INTO student (id, firstName, lastName, age) VALUES (1, 'myFisrtName', 'myLastName', 23)";
pg_exec($connection, utf8_encode($query ));
У меня есть простой синтаксис 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, например, арабское или японское слово
Попробуйте кодировать в utf-8 с помощью utf8_encode().
$query = "INSERT INTO student (id, firstName, lastName, age) VALUES (1, 'myFisrtName', 'myLastName', 23)";
pg_exec($connection, utf8_encode($query ));
Отвечая на более старую должность, но у меня была аналогичная ситуация, во время импорта 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)";
Надеюсь, это поможет кому-то.
Я не могу отправить правильный 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));