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?
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?
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?
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?
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:
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 :-).