COPY mit psql und pgAdmin (Zeichensatzproblem)

Guten Tag,

folgendes Problem:

Eine SQL-Skript einhält eine Reihe von COPY-Anweisungen zum Einlesen von CSV-Dateien, die Umlaute enthalten. Wenn ich das mit pgAdmin mache, geht es problemlos. Alles wird sauber in pgAdmin und den Clientanwendungen (Web) dargestellt. Hier ein Auschnitt aus dem SQL-Skript:

...
copy agmg_katdimgeom (ag_key, layer, graphik) from 'G:\xxx\export\agmg_katdimgeom.csv' with delimiter as '|';
copy agmg_katleitung (ag_key, layer, linetype, constantwidth, graphik) from 'G:\xxx\export\agmg_katleitung.csv' with delimiter as '|'; 
...

Wenn ich das selbe Skript in psql mit

C:\apps\PostgreSQL\9.3\bin\psql -U postgres -d agmg_db -f C:\apps\AG_KONVERTER\update_daten.sql

aufrufe, dann werden die Umlaute weder in pgAdmin noch in der Clientanwendung richtig dargestellt. Alle Datensätze sind allerdings da. Heißt, die Anzahl der Zeilen in den CSV-Dateien stimmen mit der Anzahl der Datensätze in den jeweiligen Tabellen überein.

Folgendes zu meiner Umgebung:
Win 7 64 Bit
PG 9.3.4
server_encoding UTF8
Datenbank:

CREATE DATABASE agmg_db
  WITH OWNER = postgres
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'German_Germany.1252'
       LC_CTYPE = 'German_Germany.1252'

Gibt es weitere Infos, die ich hier angeben sollte, damit Ihr mir weiterhelfen könnt?

Was kann ich tun, damit psql das selbe Verhalten zeigt, wie der Import mittels pgAdmin?

Danke im Voraus!

Peter

Vermutlich musst du bei psql noch das richtige client-encoding setzen.

Gruß Uwe

Danke für Deine schnelle Antwort! Ich hab es mit

set client_encoding='WIN1252';
und
set client_encoding='UTF8'';

am Beginn des Skriptes versucht. Leider werden die Umlaute erneut durch andere Zeichen ersetzt.

Gruß Peter

Eventuell könnte dir auch sowas wie iconv weiterhelfen um das Encoding der Datei zu Fuß zu ändern. Hab allerdings keine Ahnung ob und wie das unter Windows geht… :wink:

Gruß Uwe

Hallo,

ich glaube es gefunden zu haben. Wenn ich in psql vor einem COPY-Befehl ein

set client_encoding='UTF8';

aufrufe, dann wird die Datei so eingelesen, wie ich es erwartet habe (also dt. Umlaute richtig dargestellt). Also war ich zunächst hergegangen und habe in meinem SQL-Skript als erste Zeile die Encoding-Anweisung aufgerufen. Es folgten diverse SQL-Befehle, dann kam ein COPY, dann weitere SQL-Anweisungen, wieder ein COPY und so weiter.
Das Skript funktionierte nicht!
Die Lösung war, unmittelbar vor jedem COPY-Befehl das Encoding auszuführen.
Jetzt werde ich das mal mit einem realen Projekt testen.

Gruß - Peter

Nur kurz zur Info, es hat so wie beschrieben funktioniert.

Danke für das Feedback.

Falls Du immer noch auf 9.3.4 bist solltest Du bei Gelegenheit ein Update machen, wir sind mittlerweile bei 9.3.12 …