2009-11-05 31 views
10

Ich migriere eine db von mysql nach postgresql. Die Standardsortierung der MySQL-Datenbank ist UTF8, postgres verwendet auch UTF8, und ich kodiere die Daten mit pg_escape_string(). aber aus irgendeinem Grund, ich laufe in einige flippige Fehler über schlechte Codierung:PostgreSQL + PHP + UTF8 = Ungültige Bytesequenz für die Kodierung

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"

Ich habe versucht worden Stochern dies herauszufinden, und bemerkte, dass php etwas seltsam tut; Wenn ein String nur Ascii-Zeichen enthält (z. B. "Hallo"), ist die Codierung ASCII. Wenn die Zeichenfolge irgendwelche nicht-ASCII-Zeichen enthält, heißt es, dass die Codierung UTF8 ist (z. B. "Hallo").

Wenn ich utf8_encode() für Strings benutze, die bereits UTF8 sind, werden die speziellen Zeichen gelöscht und alle durcheinander gebracht, also ... was kann ich tun, um das zu erreichen?

(die genaue char es oben hängen jetzt ist „“, aber statt nur suchen/ersetzen, Ich mag würde eine bessere Lösung, so das ein bisschen Problem wieder passiert nicht finden)

Antwort

1

BTW , eine ASCII-Zeichenfolge ist in UTF-8 genau gleich, da sie die gleichen ersten 127 Zeichen haben; Also "Hallo" in ASCII ist genau das gleiche wie "Hallo" in UTF-8, es ist keine Konvertierung erforderlich.

Die Sortierung in der Tabelle kann UTF-8 sein, aber Sie können möglicherweise keine Informationen aus derselben Tabelle mit derselben Codierung abrufen. Nun, wenn Sie Probleme mit Informationen haben, die Sie an pg_escape_string geben, liegt das wahrscheinlich daran, dass Sie annehmen, dass von MySQL abgerufener Inhalt in UTF-8 kodiert ist, während dies nicht der Fall ist. Ich schlage vor, Sie betrachten this page on MySQL documentation und sehen die Kodierung Ihrer Verbindung; Sie holen wahrscheinlich von einer Tabelle, in der die Sortierung UTF-8 ist, aber Ihre Verbindung ist etwas wie Latin-1 (wo Sonderzeichen wie çéèêöà usw. nicht in UTF-8 kodiert werden).

+0

Nach ein paar Stunden damit zu spielen, fange ich tatsächlich zu denken, dass mysql nicht-UTF8-Strings in die db erlaubt hat, was das Problem verursacht .. – Ian

6

Höchstwahrscheinlich sind die Daten in Ihrer MySQL-Datenbank nicht UTF8. Es ist ein ziemlich häufiges Szenario. MySQL hat zumindest keine korrekte Validierung der Daten vorgenommen, so dass alles, was Sie als UTF8 angegeben haben, akzeptiert wurde, solange Ihr Client behauptete, dass es UTF8 war. Vielleicht haben sie das inzwischen behoben (oder nicht, ich weiß nicht, ob sie es überhaupt für ein Problem halten), aber Sie haben möglicherweise bereits Daten in der Datenbank falsch codiert. PostgreSQL führt beim Laden natürlich eine vollständige Überprüfung durch und kann daher fehlschlagen.

Sie können die Daten durch etwas wie iconv füttern, das so eingestellt werden kann, dass unbekannte Zeichen ignoriert werden oder in "best guess" umgewandelt werden.

+0

Exactly iconv! Vielen Dank. –

Verwandte Themen