Hallo Alle,
ist es möglich in einer Datenbank (unter Windows) die Sortierfolge auf die Deutsche Telefonbuchsortierung (DIN) umzustellen?
Meine Umgebung: PostgreSQL 8.4.3 build 1400, 32 Bit unter Windows XP
Was ich schon (erfolglos) versucht habe: Umstellen der Sortierung in den Regions- und Sprachoptionen in der Windows Systemsteuerung auf Telefonbuch (DIN), Neustart des Datenbankservers, neue Datenbank mit der Sortierfolge German_Germany.1252.
In diversen Windows Dokumentationen (MSDN u.a.) steht, dass die Locale mit der von mir gewünschten Sortierung de_DE_phoneb entspricht. Eine Entsprechung in der Angabe der Sortierfolge beim Erzeugen einer Datenbank (für LC_COLLATE) habe ich nicht gefunden. Wie lautet diese?
Oder bin ich ganz auf dem Holzweg?
Hintergrund: Ich habe eine bestehende Anwendung von einer Borland Paradox Datenbank auf PostgeSQL migiert. Der Performancegewinn ist enorm, nur die Sortierung ist nicht mehr wie gewohnt. Die SQL-Statements (insbesondere die ORDER BY Clauses) kann ich leider nicht beeinflussen…
PG baut bei der Sortierung auf die Fähigkeiten des OS auf, als muß Dein Windows auch so sortieren. Dein “German_Germany.1252” erscheint mir aber als die ‘normale’ Sortierordnung.
Keine Ahnung, was da wie bei Windows wo zu klicken und zu machen ist und welche Geister in Gedmond zu beschwören sind…
Falls Du es hinbekommst, wäre aber eine kurze Info hier ned schlecht …
PG baut bei der Sortierung auf die Fähigkeiten des OS auf, als muß Dein Windows auch so sortieren. Dein “German_Germany.1252” erscheint mir aber als die ‘normale’ Sortierordnung.
Genau das wusste ich schon: German_Germany.1252 entspricht de_DE oder Windows intern 00000407
Aber welche Zeichenfolge für LC_COLLATE entspricht de_DE_phoneb oder Windows intern 00010407?
Keine Ahnung, was da wie bei Windows wo zu klicken und zu machen ist und welche Geister in Gedmond zu beschwören sind…
Wie schon angedeutet: Für den angemeldeten Benutzer kann man in der Windows XP Systemsteuerung → Regions- und Sprachoptionen → Tabreiter Reiter Regionale Einstellungen bei ausgewählter Sprache Deutsch (Deutschland) → Schaltfläche Anpassen… → Dialog Regionale Einstellungen anpassen → Tabreiter Sortierung → in der dort angezeigten Combobox stehen Wörterbuch und Telefonbuch (DIN) zur Auswahl. In der Windows Registry ändert sich dabei HKEY_CURRENT_USER\control\Panel\International\Locale zwischen 00000407 und 00010407.
Eine Änderung dieser Einstellung (für das Benutzerprofil unter dem der Datenbankserver läuft) wirkt sich leider nicht aus: Auch in einer nach einem Neustart des Datenbankservers neu angelegten Datenbank bleibt die Sortierung unverändert.
Ich habe leider keine vollständige Dokumentation der “Übersetzung” der Lokalen á la de_DE in die Lokalen für LC_COLLATE á la German_Germany gefunden. Zumindest keine für die Lokale de_DE_phoneb. Irgendwo muss es doch da eine Entsprechung geben…?
Nein auf der CeBIT war ich nicht. Zu den Linuxtagen in Chemnitz habe ich mit den dort anwesenden PostgeSQL Leuten darüber unterhalten…
Die mir bekannten Windows Spezialisten weisen das Problem von sich: Das sei Postgres spezifisch…
Ich habe die Hoffnung, dass vielleicht schon einmal jemand ein ähnliches Problem hatte und eine Lösung kennt…
Stimmt, dort war das. Sowohl akretschmer als auch ich waren dort in Chemnitz am Stand.
Nun, die eigentliche Frage ist: wie erstellt man eine Sortierung unter Windows. Das ist nicht unbedingt PostgreSQL-spezifisch, aber unter Windows kann ich da leider nicht weiterhelfen.
Ein Ansatz wäre ev. noch, mal den Sourcen in PostgreSQL zu folgen und zu schauen, was genau auf Betriebssystemebene aufgerufen wird. Und von dort dann halt weitersuchen.
Da hab ich mir die Quellen geholt und darin “rumgelesen”. Da ich üblicherweise nicht in C Programmiere, keine entsprechende Entwicklungsumgebung am Laufen habe und die verwendeten Bibliotheken nicht kenne fühle ich mich ein bisschen wie ein Maulwurf im Kino.
Im Dunstkreis von strcoll() ist mir nichts aufgefallen. Dafür aber die Methode IsoLocaleName(…) in src/backend/utils/adt/pg_locale.c. Diese ist für das Übersetzen der Windows Locale Namen in ISO Locale Namen zuständig. Ohne die verwendeten Bibliotheken komme ich aber nicht darauf, was an Eingangsparametern zulässig ist und was zurück geliefert wird. Gibt es jemanden der mir diesen Quelltextbereich interpretieren kann? Wer hat den Code geschrieben oder fühlt sich zuständig? Kann man diesen Menschen Fragen?
Ein bisschen über den Tellerrand habe ich auch geschaut: In Oracle gibt es eine (Schema- und/oder Session-)Variable NLS_SORT. Deren Zuständigkeit entspricht LC_COLLATE in PostgeSQL. Die Oracle Variable akzeptiert die Werte GERMANY für die übliche deutsche Sortierung und X_GERMANY_DIN für die Telefonbuchsortierung. Fällt dazu jemandem die Entsprechung in PostgreSQL ein?
Ich hoffe weiter auf Hinweise…
Mit Vorausdank
Frank