2013-03-06 37 views
10

Ich habe eine einfache SQL-Syntax zum Einfügen in die Tabelle. Ich verwende Postgresql 8.4 und habe bereits die Datenbankcodierung auf UTF8 und POSIX für Sortierfolge und Zeichentyp eingestellt.Postgresql PHP ungültige Byte-Sequenz für die Codierung UTF8

Die Abfrage ist in Ordnung, wenn ich es unter pgadmin3 ausführen, aber Fehler, wenn ich in PHP ausführen.

"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\" 

Also versuchte ich Namen und client_encoding von PHP (PDO) zu setzen, aber immer noch das gleiche Problem

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

pg_set_client_encoding($link, "UNICODE"); meine seiner Arbeit, wenn ich nativen postgresql Treiber pg_pconnect, bin mit aber derzeit Ich benutze PDO als Treiber.

und i gesetzt auch schon mb_internal_encoding('UTF-8');

Gibt es eine andere Möglichkeit, dieses Problem zu beheben?

Dieser Fehler nur dann angezeigt, wenn ich nicht ascii Wort wie arabisches oder japanisches Wort

+0

Sie können Ihre gesamte Link-/Datenbankcodierung so einstellen, dass sie utf-8 verwendet. Wenn die ursprüngliche Zeichenfolge jedoch nicht utf-8-codiert ist, wird dennoch ein Fehler verursacht. – datasage

+0

Können Sie bitte das Ergebnis von 'SHOW client_encoding;' von pgAdmin posten? – Houari

+1

Bitte zeigen Sie eine Ein-Zeichen-Eingabe und die entsprechende Byte-Sequenz aus dem Fehlerbericht (wie '0xd85b'). Sie sollten uns auch mitteilen, welche Standardtextkodierung Ihr Betriebssystem hat. Wenn Sie nicht wissen, führen Sie den Befehl 'locale' aus, wenn Sie Linux/Unix verwenden. Ohne die ursprüngliche Kodierung und den ursprünglichen Text zu kennen, ist es schwer, viel zu sagen. –

Antwort

4

Versuche zu kodieren in utf-8 mit utf8_encode() versuchen, einzufügen.

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

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

Codierung der gesamten Abfrage scheint seltsam. (Ihr SQL-Beispiel könnte auch kürzer und richtiger geschrieben sein :) –

-1

Ich bin wird nicht korrekt Unicode SQL-Abfrage senden (Quercus für java variieren schlechte Arbeit von Unicode und alle wie " 'UTF8' NAMES SET," keine Arbeits) und ich nehme mir vor diese von Base64 convertation:

$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

auf einem älteren Beitrag beantworten, aber ich hatte gerade eine ähnliche Situation während einer CSV-Import, bemerkte ich den Fehler: invalid byte sequence for encoding "UTF 8": 0x95 in ....

Ich habe den Fehler behoben, indem nur Codierung aus dem Windows-1252 auf UTF-8 in PHP Umwandlung unter Verwendung von: 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)"; 

Hope this jemanden helfen.

Verwandte Themen