Ich hatte die Aufgabe, eine PostgreSQL 8.2.x-Datenbank auf einen anderen Server zu migrieren. Dazu verwende ich den pgAdmin 1.12.2 (übrigens unter Ubuntu 11.04) und das Backup and Restore mit dem benutzerdefinierten / Komprimierungsformat (.backup) und der UTF8-Codierung.
Die ursprüngliche Datenbank ist in UTF8 wie folgt:
-- Database: favela
-- DROP DATABASE favela;
CREATE DATABASE favela
WITH OWNER = favela
ENCODING = 'UTF8'
TABLESPACE = favela
CONNECTION LIMIT = -1;
Ich erstelle diese Datenbank genau so auf dem Zielserver. Wenn ich die Datenbank jedoch mit der Option "Wiederherstellen" aus der Sicherungsdatei wiederherstelle, werden einige der folgenden Fehler angezeigt:
pg_restore: restoring data for table "arena"
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2173; 0 35500 TABLE DATA arena favela
pg_restore: [archiver (db)] COPY failed: ERROR: invalid byte sequence for encoding "UTF8": 0xe3a709
HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
CONTEXT: COPY arena, line 62
Wenn ich überprüfe, welcher Datensatz diesen Fehler ausgelöst hat, haben einige vartext-Felder diakritische Zeichen wie ç (in Portugiesisch beispielsweise "caça"), und wenn ich sie manuell aus dem Text in den Datensätzen entferne, wird der Fehler an den nächsten Datensatz weitergegeben Das hat sie - da beim Kopieren ein Fehler auftritt und das Einfügen von Daten in diese Tabelle gestoppt wird. Und ich möchte sie nicht einzeln manuell ersetzen, um dies zu erreichen.
Aber es ist irgendwie seltsam, denn mit UTF8 sollte es keine derartigen Probleme geben, oder?
Ich weiß nicht, wie sie überhaupt dorthin gekommen sind. Ich migriere nur die Datenbank und nehme an, dass die Datenbank irgendwie wie in LATIN1 war und dann nicht ordnungsgemäß in UTF8 geändert wurde.
Gibt es eine Möglichkeit zu überprüfen, ob eine Tabelle / Datenbank ungültige UTF8-Sequenzen enthält? Oder eine Möglichkeit, diese Zeichen in UFT8 umzuwandeln, damit beim Ausführen der Wiederherstellung keine Probleme auftreten?
Danke im Voraus.
quelle
Es hätte passieren können, wie hier beschrieben - obwohl dies in 8.4 einen Fehler erzeugt:
Es gibt einen guten Beitrag in diesem ausgezeichneten Blog über die allgemeinen Probleme und einige Möglichkeiten, mit ihnen umzugehen
quelle
Dies ist wahrscheinlich mit der in Ihrer Unix / Linux-Umgebung verwendeten Standardkodierung der Fall. Führen Sie die folgenden Schritte aus, um zu überprüfen, welche Codierung derzeit die Standardcodierung ist:
In diesem Fall sehen wir deutlich, dass es sich nicht um eine UTF-8-Codierung handelt, auf die sich der Kopierbefehl stützt.
Um dies zu beheben, setzen wir die LANG-Variable im Beispiel auf Folgendes:
Hinweis: Dies ist nur für die aktuelle Sitzung verfügbar. Fügen Sie es zu ~ / .bashrc oder ähnlichem hinzu, damit es beim Start einer zukünftigen Shell-Sitzung verfügbar ist.
Referenz
quelle
Ich empfehle nicht, iconv blind auf dem Klartext-Dump auszuführen, da dies möglicherweise gültige Zeichen (z. B. chinesische Zeichen) in andere Zeichen umwandelt. Es ist besser, das ungültige UTF8-Zeichen zu finden, indem Sie den folgenden Befehl ausführen.
Führen Sie anschließend iconv für die jeweiligen Daten aus. In diesem Dokument finden Sie detaillierte schrittweise Erklärungen .
quelle