2013-03-06 7 views
10

Mam prostą składnię SQL do wstawienia do tabeli. Używam PostgreSQL 8.4 i już ustawiłem kodowanie bazy danych na UTF8, a POSIX na sortowanie i typ znaku.Postgresql Niepoprawna sekwencja bajtów PHP do kodowania UTF8

Zapytanie jest w porządku, jeśli uruchomię go pod pgadmin3, ale przyniosę błąd, jeśli wykonam w 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\" 

więc próbowałem ustawić nazwisk i client_encoding z PHP (PDO), ale nadal mają ten sam problem

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

pg_set_client_encoding($link, "UNICODE"); moich za pracę, jeśli używam natywny sterownik postgresql pg_pconnect, ale obecnie Używam PDO jako Driver.

i ja też już ustawione mb_internal_encoding('UTF-8');

Czy jest jakiś inny sposób, aby rozwiązać ten problem?

Ten błąd pojawia się tylko wtedy, gdy próbujesz wstawić non słowo ascii jak arabski czy japoński słowo

+0

Możesz ustawić kodowanie wszystkich linków/baz danych, aby używało utf-8, ale jeśli oryginalny ciąg nie jest zakodowany w utf-8, nadal będzie powodować błąd. – datasage

+0

Czy możesz opublikować wynik polecenia 'SHOW client_encoding;' z pgAdmin? – Houari

+1

Proszę pokazać wejście pojedynczego znaku i odpowiadającą sekwencję bajtów z raportu o błędzie (np. '0xd85b'). Powinieneś również powiedzieć nam, jakie jest domyślne kodowanie tekstu w twoim systemie operacyjnym; jeśli nie wiesz, uruchom komendę 'locale', jeśli używasz systemu Linux/Unix. Bez znajomości oryginalnego kodowania i oryginalnego tekstu trudno powiedzieć wiele. –

Odpowiedz

4

Spróbuj kodować w UTF-8 z utf8_encode().

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

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

Kodowanie całego zapytania wydaje się dziwne. (Twój przykład SQL może być krótszy i bardziej poprawny :) –

-1

I'am nie będzie można przesłać poprawną unicode zapytania SQL (Quercus dla java zmieniać złe pracy z Unicode i wszystko jak "SET 'UTF8' names"; bez pracy) oraz I rozwiązać ten z Base64 konwertowanie:

$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

Odpowiadając na stanowisku starszego, ale po prostu miałem podobną sytuację, podczas importu CSV, zauważyłem błąd: invalid byte sequence for encoding "UTF 8": 0x95 in ....

Naprawiłem błąd, tylko konwersja kodowania z Windows-1252 na UTF-8 w PHP za pomocą: 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)"; 

nadzieję, że pomoże ktoś.