Unicode Datenbanken mit PG 7.4

Lists: pgsql-de-allgemein
From: "W(dot) Haslbeck" <spam(dot)langweilt(at)gmx(dot)de>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Unicode Datenbanken mit PG 7.4
Date: 2005-01-18 19:12:02
Message-ID: 200501182012.02168.spam.langweilt@gmx.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

Hallo,

Ich hab hier ein Problem mit PostgreSQL 7.4.[5|6]:

In einer existierenen Datenbank mit Codierung 'LATIN9' sollen ein paar neue
Tabellen angelegt werden, die Unicode Zeichen enthalten (z.B. Russische
Begriffe). Da die Codierung nur Datenbankweit festgelegt werden kann,
hab ich einen kompletten Dump gemacht, ihn etwas behandelt (ISO-8859-15 nach
UTF-8 mit iconv konvertiert, sowie alle vorkommen von 'LATIN9' in 'UNICODE'
abgeändert), mit dropdb die alte DB gelöscht und schliesslich den Dump
importiert. Soweit klappt alles ganz gut.

Auf die DB greift u.a. eine legacy-Applikation zu, die mit UTF-8 nichts
anfangen kann. Deshalb habe ich in der postgresql.conf den Parameter
'client_encoding' auf latin9 gesetzt, damit ist die Standard-Client-Kodierung
ISO-8859-15 und die Applikation ist glücklich. Die Unicode-taugliche
Anwendung, die auf die Unicode-enthaltenden-Tabellen zugreift, schickt am
Anfang der Session ein 'SET CLIENT_ENCODING TO UTF8;' und alles ist gut.

Ok, jetzt das Probem:
Da client_encoding standardmässig nun ja auf LATIN9 steht, die Tabellen aber
teilweise Unicode-Zeichen enthalten, fällt ein pg_dump (bzw. pg_dumpall) auf
die Schnauze, wenn es auf Einträge trifft, die sich nicht in ISO-8859-15
abbilden lassen. Das sieht dann in etwa so aus:

$ su postgres -c "pg_dumpall >dump"
pg_dump: WARNING: ignoring unconvertible UTF-8 character 0xc4a2
pg_dump: WARNING: ignoring unconvertible UTF-8 character 0xc584
pg_dump: WARNING: ignoring unconvertible UTF-8 character 0xd184
pg_dump: WARNING: ignoring unconvertible UTF-8 character 0xd186
pg_dump: WARNING: ignoring unconvertible UTF-8 character 0xd0b9
pg_dump: WARNING: ignoring unconvertible UTF-8 character 0xd0bb
$

Das ist natürlich fatal, ein Backup in Form eines DB-Dumps ist Pflicht.

Ich bin jetzt in der Zwickmühle:
Stell ich den Parameter 'client_encoding' in der postgresql.conf auf utf8,
dann klappt der Dump, aber die Nicht-Unicode-tauglichen Anwendungen fallen
auf die Schnauze. Stell ich ihn auf latin9, dann laufen zwar die Anwendungen,
aber das Backup versagt.

Lange rede, kurzer Sinn: gibt es eine Möglichkeit, pg_dump bzw. pg_dumpall
mitzuteilen, mit welchem client_encoding sie die Daten entladen sollen?
(Oder muss ich schon mal meinen Compiler warmlaufen lassen und den Source
patchen?)

Walter


From: Ralf Schuchardt <rasc(at)gmx(dot)de>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Unicode Datenbanken mit PG 7.4
Date: 2005-01-18 19:49:18
Message-ID: 20050118204918.470979d7@lord.homenet
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

On Tue, 18 Jan 2005 20:12:02 +0100
"W. Haslbeck" <spam(dot)langweilt(at)gmx(dot)de> wrote:

> Lange rede, kurzer Sinn: gibt es eine Möglichkeit, pg_dump bzw.
> pg_dumpall mitzuteilen, mit welchem client_encoding sie die Daten
> entladen sollen?(Oder muss ich schon mal meinen Compiler warmlaufen
> lassen und den Source patchen?)

Versuchs mal damit beim dumpen:

"If environment variable PGCLIENTENCODING is defined in the client's
environment, that client encoding is automatically selected when a
connection to the server is made."

Viele Grüße
Ralf


From: Peter Eisentraut <peter_e(at)gmx(dot)net>
To: "W(dot) Haslbeck" <spam(dot)langweilt(at)gmx(dot)de>
Cc: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Unicode Datenbanken mit PG 7.4
Date: 2005-01-18 19:52:22
Message-ID: 200501182052.23223.peter_e@gmx.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

W. Haslbeck wrote:
> Lange rede, kurzer Sinn: gibt es eine Möglichkeit, pg_dump bzw.
> pg_dumpall mitzuteilen, mit welchem client_encoding sie die Daten
> entladen sollen?

Man könnte vielleicht mit ALTER USER dem "Administrator"-Benutzer
UNICODE als client_encoding zuweisen und den Benutzern, die von den
Nicht-Unicode-tauglichen Anwendungen verwendet werden, stattdessen
LATIN9. (Oder einfach nur den letzteren, da ersteres ja die
Vorgabeeinstellung ist.)

--
Peter Eisentraut
http://developer.postgresql.org/~petere/


From: "W(dot) Haslbeck" <spam(dot)langweilt(at)gmx(dot)de>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Unicode Datenbanken mit PG 7.4
Date: 2005-01-18 20:08:50
Message-ID: 200501182108.50677.spam.langweilt@gmx.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

Hallo,

> Man könnte vielleicht mit ALTER USER dem "Administrator"-Benutzer
> UNICODE als client_encoding zuweisen und den Benutzern, die von den

Danke! Klappt wunderbar.
Und Danke! auch an Ralf, die Masche mit $PGCLIENTENCODING klappt auch.

Im Backupscript steht nun ein

su postgres -c "PGCLIENTENCODING=UNICODE pg_dumpall | bzip2 >$DUMPNAME"

und alles ist gut.

Walter