it-swarm.com.de

ungültige Bytefolge zur Kodierung von "UTF8"

Ich bin versucht einige Daten zu importieren in meine Datenbank. Also habe ich eine temporäre Tabelle erstellt,

create temporary table tmp(pc varchar(10), lat decimal(18,12), lon decimal(18,12), city varchar(100), prov varchar(2));

Und jetzt versuche ich die Daten zu importieren,

 copy tmp from '/home/mark/Desktop/Canada.csv' delimiter ',' csv

Aber dann bekomme ich den Fehler,

ERROR:  invalid byte sequence for encoding "UTF8": 0xc92c

Wie kann ich das beheben? Muss ich die Codierung meiner gesamten Datenbank ändern (wenn ja, wie?) Oder kann ich nur die Codierung meiner tmp-Tabelle ändern? Oder sollte ich versuchen, die Kodierung der Datei zu ändern?

103
mpen

Wenn Sie UTF8-Daten in Ihrer Datenbank speichern müssen, benötigen Sie eine Datenbank, die UTF8 akzeptiert. Sie können die Verschlüsselung Ihrer Datenbank in pgAdmin überprüfen. Klicken Sie einfach mit der rechten Maustaste auf die Datenbank und wählen Sie "Eigenschaften".

Aber dieser Fehler scheint Ihnen zu sagen, dass in Ihrer Quelldatei ungültige UTF8-Daten enthalten sind. Das bedeutet, dass das Dienstprogramm copy erkannt oder vermutet hat, dass Sie eine UTF8-Datei einspeisen.

Wenn Sie eine Unix-Variante verwenden, können Sie die Kodierung (mehr oder weniger) mit dem Dienstprogramm file überprüfen.

$ file yourfilename
yourfilename: UTF-8 Unicode English text

(Ich denke, das funktioniert auch auf Macs im Terminal.) Nicht sicher, wie man das unter Windows macht.

Wenn Sie dasselbe Dienstprogramm für eine Datei verwenden, die von Windows-Systemen stammt (d. H. Eine Datei, die nicht in UTF8-kodiert ist), zeigt es wahrscheinlich Folgendes:

$ file yourfilename
yourfilename: ASCII text, with CRLF line terminators

Wenn die Dinge seltsam bleiben, können Sie versuchen, Ihre Eingabedaten in eine bekannte Kodierung zu konvertieren, um die Kodierung Ihres Clients oder beides zu ändern. (Wir erweitern wirklich die Grenzen meines Wissens über Kodierungen.)

Sie können das Dienstprogramm iconv verwenden, um die Kodierung der Eingabedaten zu ändern.

iconv -f original_charset -t utf-8 originalfile > newfile

Sie können die Kodierung von psql (dem Client) gemäß den Anweisungen unter Character Set Support ändern. Suchen Sie auf dieser Seite nach der Phrase "So aktivieren Sie die automatische Zeichensatzkonvertierung".

psql=# copy tmp from '/path/to/file.csv' with delimiter ',' csv header encoding 'windows-1251';

Das Hinzufügen der Option encoding hat in meinem Fall funktioniert.

43
Nobu

Anscheinend kann ich einfach die Kodierung einstellen on the fly,

 set client_encoding to 'latin1'

Führen Sie dann die Abfrage erneut aus. Nicht sicher, welche Codierung ich verwenden sollte.


latin1 machte die Zeichen lesbar, aber die meisten Akzentzeichen waren in Großbuchstaben, wo sie nicht hätten sein dürfen. Ich nahm an, dass dies auf eine schlechte Kodierung zurückzuführen war, aber ich glaube, dass die Daten tatsächlich schlecht waren. Am Ende behielt ich die latin1-Codierung bei, aber die Daten wurden vorverarbeitet und die Gehäuseprobleme behoben.

10
mpen

Wenn Sie nicht umsetzbare Zeichen verwerfen möchten, können Sie -c flag verwenden

iconv -c -t utf8 filename.csv > filename.utf8.csv

und kopiere sie dann in deinen Tisch

6
Abdellah Alaoui

Dieser Fehler bedeutet, dass sich die Datensatzkodierung in der Datei in Bezug auf die Verbindung unterscheidet. In diesem Fall kann iconv den Fehler zurückgeben, manchmal sogar trotz // IGNORE-Flag: 

iconv -f ASCII -t utf-8 // IGNORE <b.txt> /a.txt

iconv: unzulässige Eingabesequenz an Position (einige Zahl) 

Der Trick besteht darin, falsche Zeichen zu finden und zu ersetzen. Um dies unter Linux zu tun, verwenden Sie den Editor "vim": 

vim (Ihre Textdatei), drücken Sie die Taste "ESC": und geben Sie ": goto (von iconv zurückgegebene Nummer)" ein.

Um nicht nach ASCII Zeichen zu suchen, können Sie den folgenden Befehl verwenden:

grep --color = 'auto' -P "[\ x80-\xFF]"  

Wenn Sie falsche Zeichen entfernen, überprüfen Sie bitte, ob Sie Ihre Datei wirklich konvertieren müssen: Wahrscheinlich ist das Problem bereits gelöst.

6
Yuri Levinsky

Es hängt davon ab, welche Art von Computer/Codierung Ihre Importdatei generiert hat.

Wenn Sie es von einer englischen oder westeuropäischen Version von Windows erhalten, setzen Sie es wahrscheinlich am besten auf "WIN1252". Wenn Sie es aus einer anderen Quelle beziehen, sehen Sie sich die Liste der Zeichencodierungen hier an:

http://www.postgresql.org/docs/8.3/static/multibyte.html

Wenn Sie es von einem Mac erhalten, müssen Sie es möglicherweise zuerst mit dem Dienstprogramm "iconv" ausführen, um es von MacRoman nach UTF-8 zu konvertieren.

4
BobG

Nun, ich hatte das gleiche Problem. Und was mein Problem gelöst hat, ist folgendes:

Klicken Sie in Excel auf Speichern unter . Wählen Sie unter Speichern als Typ .csv .__ aus. Klicken Sie auf Tools . Wählen Sie dann Web-Optionen aus der Dropdown-Liste . Speichern Sie das Dokument unter Encoding als Unicode (UTF-8) . Klicken Sie auf OK. Speichern Sie die Datei. ERLEDIGT !

4

führen Sie die folgenden Schritte aus, um dieses Problem in pgadmin zu beheben:

  1. SET client_encoding = 'ISO_8859_5';

  2. COPY tablename(column names) FROM 'D:/DB_BAK/csvfilename.csv' WITH DELIMITER ',' CSV ;

3
Ramesh R

Ich hatte das gleiche Problem und fand hier eine nette Lösung: http://blog.e-Shell.org/134

Dies wird durch eine Nichtübereinstimmung Ihrer Datenbankkodierungen verursacht. Dies liegt sicherlich daran, dass die Datenbank, von der Sie den SQL-Dump erhalten haben, als SQL_ASCII kodiert wurde, während die neue als UTF8 kodiert wurde. .. Recode ist ein kleines Tool aus dem GNU - Projekt, mit dem Sie die Codierung einer Datei im Handumdrehen ändern können.

Also habe ich das Dumpfile gerade umkodiert, bevor ich es abspiele:

postgres> gunzip -c /var/backups/pgall_b1.Zip | recode iso-8859-1..u8 | psql test

In Debian- oder Ubuntu-Systemen kann recode über ein Paket installiert werden.

2
Ed Doerr

Sie können das Backslash-Zeichen durch sed, beispielsweise ein Pipe-Zeichen, ersetzen.

sed -i -- 's/\\/|/g' filename.txt
2

Für Python müssen Sie verwenden

Klasse pg8000.types.Bytea (str) Bytea ist eine von str abgeleitete Klasse, die einem PostgreSQL-Byte-Array zugeordnet ist.

oder

Pg8000.Binary (Wert) Konstruieren Sie ein Objekt, das binäre Daten enthält.

1
vrn

Kurzes Beispiel zur Lösung dieses Problems in PHP-

$val = "E'\377'";
iconv(mb_detect_encoding($val, mb_detect_order(), true), "UTF-8", $val);

Fehlerdetails: Da die POSTGRES-Datenbank nur UTF-8-Zeichen verarbeitet, wird beim Versuch, die oben angegebenen Eingaben an eine Spalte zu übergeben, der Fehler "Ungültige Bytefolge für die Codierung von" UTF8 ": 0xab" ausgegeben.

Konvertieren Sie diesen Wert einfach in UTF-8, bevor Sie ihn in die POSTGRES-Datenbank einfügen.

1
Nneha Sachan
copy tablename from 'filepath\filename' DELIMITERS '=' ENCODING 'WIN1252';

sie können dies versuchen, um die UTF8-Codierung zu verarbeiten.

1
Rishi jha

Dieser Fehler kann auftreten, wenn Eingabedaten selbst Escapezeichen enthalten. Das Standardzeichen für das Escape-Zeichen ist das Symbol "\". Wenn Ihr Eingabetext das Zeichen "\" enthält, ändern Sie den Standardwert mit der Option ESCAPE.

1
jaasco

Mit diesem Fehler ist es auch sehr gut möglich, dass das Feld an Ort und Stelle verschlüsselt wird. Stellen Sie sicher, dass Sie die richtige Tabelle betrachten. In einigen Fällen erstellen Administratoren eine unverschlüsselte Ansicht, die Sie stattdessen verwenden können. Ich bin kürzlich auf ein sehr ähnliches Problem gestoßen.

0
Josh Barton

Öffnen Sie die Datei CSV über Notepad ++. Wählen Sie das Menü Encoding\Encoding in UTF-8 aus, und korrigieren Sie dann einige Zellen manuell. 

Dann versuchen Sie den Import erneut.

0
foobarfuu

Ich habe dieselbe Fehlermeldung erhalten, als ich versuchte, eine von Excel generierte CSV-Datei in eine Postgres-Tabelle (alle auf einem Mac) zu kopieren. So habe ich es gelöst:

1) Öffnen Sie die Datei in Atom (das von mir verwendete IDE).

2) Nehmen Sie eine unbedeutende Änderung in der Datei vor. Speicher die Datei. Machen Sie die Änderung rückgängig. Speichern Sie erneut.

Presto! Kopierbefehl funktionierte jetzt. 

(Ich denke, Atom hat es in einem Format gespeichert, das funktionierte.) 

0
Anupam