2009-11-05 16 views
10

Sto migrando un db da mysql a postgresql. Le regole di confronto predefinite di mysql db sono UTF8, postgres utilizza anche UTF8 e sto codificando i dati con pg_escape_string(). Per qualsiasi motivo però, mi sto correndo in alcuni errori funky su Bad codifica:PostgreSQL + PHP + UTF8 = sequenza di byte non valida per la codifica

pg_query() [function.pg-query]: Query failed: ERROR: invalid byte sequence for encoding "UTF8": 0xeb7374 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client"

Sono stato rovistando cercando di capire questo fuori, e ho notato che il PHP sta facendo qualcosa di strano; se una stringa ha solo caratteri ascii (ad esempio "ciao"), la codifica è ASCII. Se la stringa contiene caratteri non ascii, la codifica è UTF8 (ad esempio "Hëllo").

Quando uso utf8_encode() su stringhe che sono già UTF8, uccide i caratteri speciali e li rende tutti incasinati, quindi .. cosa posso fare per farlo funzionare?

(char esatto appenderlo in questo momento è "", ma invece di ricerca/sostituzione, mi piacerebbe trovare una soluzione migliore in modo da questo genere problema non accada di nuovo)

risposta

1

BTW , una stringa ASCII è esattamente la stessa in UTF-8 perché condividono gli stessi primi 127 caratteri; quindi "Hello" in ASCII è esattamente lo stesso di "Hello" in UTF-8, non è necessaria alcuna conversione.

Le regole di confronto nella tabella possono essere UTF-8 ma non è possibile recuperare le informazioni da esso nella stessa codifica. Ora, se hai problemi con le informazioni fornite a pg_escape_string, probabilmente è perché stai assumendo che il contenuto recuperato da MySQL sia codificato in UTF-8 mentre non lo è. Ti suggerisco di guardare this page on MySQL documentation e vedere la codifica della tua connessione; probabilmente stai recuperando da una tabella in cui le regole di confronto sono UTF-8 ma la tua connessione è qualcosa di simile a Latin-1 (dove caratteri speciali come çéèêöà non saranno codificati in UTF-8).

+0

Dopo alcune ore di giocherellando con questo, in realtà sto iniziando a pensare che mysql abbia consentito stringhe non-utf8 nel db, che è ciò che sta causando il problema .. – Ian

6

Molto probabilmente, i dati nel database MySQL non sono UTF8. È uno scenario abbastanza comune. MySQL almeno ha usato per non fare alcuna convalida adeguata sui dati, quindi ha accettato qualsiasi cosa tu abbia gettato su di esso come UTF8 fintanto che il tuo cliente ha affermato che era UTF8. Potrebbero averlo risolto (o no, non so se lo considerano un problema), ma potresti avere già dati codificati in modo errato nel db. PostgreSQL, ovviamente, esegue la piena validazione quando lo si carica, e quindi potrebbe fallire.

Si consiglia di alimentare i dati tramite qualcosa come iconv che può essere impostato per ignorare caratteri sconosciuti o trasformarli in "best guess".

+0

Esattamente iconv! Grazie. –

Problemi correlati