2013-03-06 10 views
10

Ho una semplice sintassi SQL per l'inserimento nella tabella. Sto usando Postgresql 8.4 e ho già impostato la codifica del database come UTF8 e POSIX per il confronto e il tipo di carattere.Postgresql sequenza di byte non valida PHP per la codifica UTF8

La query va bene se la eseguo sotto pgadmin3, ma porto errore se eseguo in 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\" 

così ho cercato di impostare i nomi e client_encoding da PHP (DOP), ma hanno ancora lo stesso problema

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

pg_set_client_encoding($link, "UNICODE"); mio essere lavoro se sto usando il driver nativo di PostgreSQL pg_pconnect, ma attualmente sto usando PDO come driver.

e ho anche già impostato mb_internal_encoding('UTF-8');

C'è un altro modo per risolvere questo problema?

Questo errore appare solo quando si cerca di inserire la parola non ASCII come parola araba o giapponese

+0

È possibile impostare tutta la codifica del collegamento/database per utilizzare utf-8 ma se la stringa originale non è codificata utf-8 causerà comunque un errore. – datasage

+0

Puoi per favore pubblicare il risultato di 'SHOW client_encoding;' da pgAdmin? – Houari

+1

Mostrare un input a carattere singolo e la sequenza di byte corrispondente dal report di errore (come '0xd85b'). Dovresti anche dirci quale sia la codifica del testo predefinita del tuo sistema operativo; se non lo sai, esegui il comando 'locale' se sei su Linux/unix. È difficile dire molto senza conoscere la codifica originale e il testo originale. –

risposta

4

Provare per codificare in UTF-8 con utf8_encode().

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

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

La codifica dell'intera query sembra strana. (Inoltre, il tuo esempio SQL potrebbe essere più breve e più correttamente scritto :) –

-1

I'am non sarà in grado di presentare corretto unicode SQL-query (quercus per java variano cattivo lavoro da Unicode e tutti come "SET 'utf8' NOMI;" senza lavoro), e ho risolvere questo da 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

Risposta dal un posto più vecchio, ma, ho appena avuto una situazione simile, nel corso di un'importazione CSV, ho notato l'errore: invalid byte sequence for encoding "UTF 8": 0x95 in ....

Ho risolto l'errore da una semplice conversione di codifica da Windows-1252 a UTF-8 in PHP utilizzando: 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)"; 

Spero che questo vi aiuterà qualcuno.

Problemi correlati