Umlautesortierung in Postgres

Frank Jagusch frank at jagusch-online.de
Do Nov 5 21:26:16 CET 2009


Am Dienstag, den 03.11.2009, 23:59 +0100 schrieb Jan-Benedict Glaw:
> On Tue, 2009-11-03 22:00:37 +0100, Frank Jagusch <frank at jagusch-online.de> wrote:
> > Am Dienstag, den 03.11.2009, 20:25 +0100 schrieb Jan-Benedict Glaw:
> > > On Tue, 2009-11-03 20:12:59 +0100, Frank Jagusch <frank at jagusch-online.de> wrote:
> > > > Am Dienstag, den 03.11.2009, 19:33 +0100 schrieb Jan-Benedict Glaw:
> > > > > On Tue, 2009-11-03 19:18:16 +0100, Frank Jagusch <frank at jagusch-online.de> wrote:
> > > > > > Am Montag, den 02.11.2009, 22:47 +0100 schrieb Jan-Benedict Glaw:
> > > > > > > On Mon, 2009-11-02 19:06:34 +0100, Frank Jagusch <frank at jagusch-online.de> wrote:
> > > > > > > > Hi alle,
> > > > > > > > da ist mir was unklar und auch nach einigem Suchen hab' ich keine Lösung
> > > > > > > > gefunden:
> > > > > > > > Bei einem SELECT FOO FROM BAR ORDER BY FOO bekomme ich von meinem auf
> > > > > > > > de_de eingestellten 8.3-er PostgreSQL folgende Sortierung
> > > > > > > > (exemplarisch):
> > > > > [...]
> > > > Irgendwie muss PostgreSQL doch intern die Sortierung der Lokalisierung
> > > > anpassen. Das geht ja mit den verschiedensten Sprachen. Ich kann mir
> > > > nicht vorstellen, dass da keine Möglichkeit zur Anpassung vorhanden ist.
> > > > Nur hab ich die Stelle nicht gefunden...
> > > 
> > > Alternativ könntest Du (in 8.4 geht das, ob das in Vorgängerversionen
> > > auch schon tut, weiß ich nicht) die ganze DB dump'en, wegwerfen und
> > > neuanlegen.
> > > 
> > > Beim `createdb' kannst Du --lc-collate mitangeben. Jetzt müßtest Du
> > > "nur" noch eine LOCALE finden, in der so sortiert wird, wie Du das
> > > möchtest. (Notfalls selbst eine schreiben...)
> > 
> > Da hast du nun auch die Richtung erreicht, in die meine Gedanken nach
> > einigen Stunden Materialstudium gingen. In den 8.3'ern geht das auch
> > schon. Sicher gibt es schon irgendwo so eine LOCALE - zumindest kann ich
> > mir nur schwer vorstellen, dass ich der erste PostgreSQL Anwender bin,
> > der dieses Problem hat. Nur: Wo finde ich diese LOCALE?
> 
> Das ist keine PostgreSQL-spezifische Sache! Das kommt (typischerweise)
> als `locales'-Paket als eine Komponente der GNU libc ins System. Die
> Aufgabenstellung lautet also, eine Sprache in einem Land zu finden,
> die diese Sortierreihenfolge vorgibt.

Hm, ich glaub da liegst Du nicht richtig: beim initdb kannst Du eine
locale mitgeben. Die Einstellung liegt dann in der postgresql.conf im
Schalter default_text_search_config. Die sollte man freilich später
nicht mehr ändern, da sonst mindestens die Textindexe ins Stolpern
kommen.

> > Falls ich doch der erste bin: Gibt es irgendwo eine Anleitung wie man so
> > eine LOCALE ohne exorbitanten Aufwand schreibt? Der Server läuft unter
> > Windows und ich habe da keinen passenden Compiler...
> 
> Eh, Windows? Oh...  Da ist zuerst die Frage, ob der PostgreSQL-Server
> nativ läuft, oder via Cygwin. Wenn das System nativ läuft, wirst Du
> für das entsprechende Land das Sprachpaket installieren müssen.
> Ergo ist die Vorbereitung, daß das System mit Dir in der Sprache
> sprechen könnte.

Unter Windows wird die locale in einem der Dialoge des Installers
abgefragt. Meines Wissens ist damit loacle des PostgeSQL Servers
unabhängig von der des Windows Systems. Die (mir bekannte) einige
Einschränkung ist, dass immer nur der gesamte der Server auf eine locale
eingestellt werden kann (nicht auf Datenbankebene).

> Unter einem GNU-System würde man (vorausgesetzt, keine Sprache nutzt
> bisher so eine Sortierung) einfach ein paar Tabellen schreiben, die
> die Reihenfolge der Zeichen vorgibt. Wie Windows das löst... Keine
> Ahnung.  Aber informativerweise: Unter welcher Locale läuft denn
> bisher die Datenbank?

Wo würdest Du denn so eine Tabelle in einem GNU-System suchen?
Vielleicht findet sich ja eine Entsprechung in einer Windows
Installation von PostgrSQL?
Meine Serverinstanz läuft mit den folgenden Einstellungen (aus der
postgresql.conf):
# These settings are initialized by initdb, but they can be changed.
lc_messages = 'German_Germany.1252' # locale for system error message
lc_monetary = 'German_Germany.1252' # locale for monetary formatting
lc_numeric = 'German_Germany.1252' # locale for number formatting
lc_time = 'German_Germany.1252'	# locale for time formatting
# default configuration for text search
default_text_search_config = 'pg_catalog.german'

Grüße von
Frank
-- 
http://www.jagusch-online.de/frank