Sortierung mit Umlauten (regexp_replace)

Hallo Leute,

ich habe eine Liste mit Namen und weiteren Werten. Ich habe es nun prinzipiell geschafft, auch Umlaute an der richtigen Stelle zu schreiben. Das mache ich mit

SELECT * FROM liste ORDER BY regexp_replace(nname, ‘Ä’,‘Ae’,‘g’)

Nun möchte ich aber natürlich alle Umlaute enthalten haben. Das habe ich versucht mit

SELECT * FROM liste ORDER BY regexp_replace(nname, ‘Ä|ä|Ö|ö|Ü|ü’,‘Ae|ae|Oe|oe|Ue|ue’,‘g’)

Natürlich geht das irgendwie nicht. Kann mir einer sagen, wie ich das am besten lösen kann?

Ich sortiere in der Liste (Sortiermöglichkeit vorhanden) zweimal nach Nachname. 1. als Default, also beim Aufruf der Seite und 2. als Sortierauswahl. Inhalt der Abfrage ist identisch, aber bei Beiden kommt ein anderes Ergebnis raus, aber jeweils immer das Gleiche. Kann mir das einer erklären?


Gruß
tsj

Was hast Du da eingestellt für Zeichensatz und Locale?

Andreas

Für Zeichensatz habe ich Latin8 und für Locale habe ich leider gar nichts angegeben. Da wird dann wohl der Standard drin sein. Aber ich kann das doch durch regexp_replace() beheben/umgehen, oder sehe ich das falsch?

Kann man in pgAdmin auch die Locale bestimmen?

Man kann das sicherlich so machen, ja. Aber besser wäre wohl, locale richtig einzustellen. regexp_replace ist vergleichsweise teuer.


Andreas

Wie kann ich denn dann jetzt die Locale-Einstellung ändern? Habe gelesen, dass es nur durch initdb eingestellt werden kann. Das hieße, ich muss die DB komplett neu initalisieren, kann dafür aber bestimmt nicht einfach die alte nehmen, oder?

Ich benutze Linux und habes zuvor so gemacht:

su postgres -c “/foobar/pgsql/bin/initdb -D /foobar/pgsql/data”

Richtig sollte es nun sein

su postgres -c “/foobar/pgsql/bin/initdb -D --locale=de_DE /foobar/pgsql/data”


Doch kann wie mache ich das nun am sinnvollsten, vor allem ohne Datenverlust?

Aso…übrigens wollte ich eigentlich noch wissen, wie ich generell bei regexp_replace() kombinieren kann.

Ungetestet: der Dump sollte wieder einspielbar sein.


su postgres -c “/foobar/pgsql/bin/initdb -D --locale=de_DE /foobar/pgsql/data”

vielleicht auch besser de_DE.utf8, aber ich bin da jetzt auch nicht so dolle firm.



Andreas



test=*# select regexp_replace(regexp_replace(regexp_replace('ABC', 'A', 'a'),'B','b'),'C','c');
 regexp_replace
----------------
 abc
(1 row)

Andreas

Danke!

Ich upgrade jetzt erstmal von 8.1.4 auf 8.2.1. Dann muss ich sowieso neu initalisieren.

Ich habe nun das Update ausgeführt und diesmal die DB mit

initdb -D /foobar/pgsql/data --locale=de_DE

initialisiert. Es funktioniert nun fast zu 100%. Was ich nicht verstehe, ist dass er mir z.B. die Namen Brückner und Brucksteg nicht

Brucksteg
Brückner

sortiert, sondern

Brückner
Brucksteg

Gleiches Phänomen habe ich auch bei anderen Namen. Generell kann man damit leben, aber verstehen tue ich es nicht. Hat vielleicht hierzu noch jemand eine Idee?

thesecondjoker schrob am 4899. September 1993:

initdb -D /foobar/pgsql/data --locale=de_DE

initialisiert. Es funktioniert nun fast zu 100%. Was ich nicht verstehe, ist
dass er mir z.B. die Namen Brückner und Brucksteg nicht

Brucksteg
Brückner

sortiert, sondern

Brückner
Brucksteg

Gleiches Phänomen habe ich auch bei anderen Namen. Generell kann man damit
leben, aber verstehen tue ich es nicht. Hat vielleicht hierzu noch jemand eine
Idee?

Postgres verwendet zum Sortieren Funktionen des Betriebssystems, und das hält
sich in deinem Fall im Locale “de_DE” vermutlich an ISO/IEC 14651:2001. Wenn man
davon abweichen will, muss man sich nun mit den Implementierungsdetails des
Betriebssystems beschäftigen.

GNU-Systeme halten sich z.B. an POSIX, welches eine Locale-Spezifikationsdatei
standardisiert, in der u.a. die Sortierung festlegt wird:

http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap07.html

Das passende Werkzeug zum übersetzen einer solchen Spezifikation ist localedef:

http://www.opengroup.org/onlinepubs/009695399/utilities/localedef.html

Damit ließe sich dann ein passendes Locale mit einer Wunschsortierung bauen -
z.B. “de_DE@mycollation” - welche man Postgres dann beim initdb mitgeben kann.

Ich hoffe, hiermit sind nun alle Mythen um die Sortierung beseitigt :-).

Gruß
Andreas

:smiley: OK, hast gewonnen! :wink:

Ich hoffe, dass dieser Thread auch Anderen helfen kann. Ich habe mich bisher im I-NET dumm und dusselig gesucht und nichts anständiges gefunden.

Vielen Dank Andreas!!


Gruß
tsj