Postgres Telefonbuch Sortierung

ralfhpunkt

ralfhpunkt

Mitglied
Thread Starter
Dabei seit
01.07.2007
Beiträge
63
Reaktionspunkte
8
Hallo,

ich habe folgendes Problem, der PostgeSQL Server unter OS X (SL 10.6.4) sortiert Umlaute in einer anderen Reihenfolge als unser Linux-Server.

Installiert ist ein "postgresql84-server @8.4.4 databases/postgresql84-server" über macports.

Auf dem Linux Server läuft ein PostgreSQL 8.3.9.

Beide Server sind vom Encoding gleich konfiguriert.

=> show client_encoding;
client_encoding
-----------------
UTF8

=> show lc_ctype;
lc_ctype
-------------
de_DE.UTF-8

=> show lc_collate;
lc_collate
-------------
de_DE.UTF-8

Laut Dokumentation ist die Variable lc_collate für die Sortierung zuständig und greift auf das Betriebssystem zurück. Ich habe in den Einstellungen "Sprache&Text" die Reihenfolge auf "Deutsch (Telefonbuch-Sortierregeln)" gestellt aber ohne Erfolg.

DerBefehl - select id, surname from "person" order by "surname" asc;
liefert unter Linux:

7 | Lahm
12 | Mertesacker
14 | Müller
17 | Mustermann
10 | Odonkor
16 | Özil
8 | Podolski

und unter OS X:

7 | Lahm
12 | Mertesacker
17 | Mustermann
14 | Müller
10 | Odonkor
8 | Podolski
16 | Özil

:confused:

Was muss ich am PostgreSQL und/oder OS X noch einstellen damit die Sortierung korrekt funktioniert?

Viele Grüße
Ralf
 
so hier mal die Ausgabe von locale von beiden Systemen.

OS X:
regius:~ >locale
LANG="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_CTYPE="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_ALL=

Linux:
acme:~ # locale
LANG=POSIX
LC_CTYPE=de_DE.UTF-8
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

In der LC_COLLATE die für die Sortierung zuständig ist, stehen wirklich unterschiedliche Werte.

Laut der Doku vom PostgreSQL 8.4 kann man jetzt verschiede encoding pro DB konfigurieren.
http://www.postgresql.org/docs/8.4/interactive/multibyte.html

Ich habe jetzt mal die DB mit folgendem Befehl angelegt, also lc_collate und lc_ctype wie auf dem Linux Server

/opt/local/lib/postgresql84/bin/createdb -T template0 --lc-collate=POSIX --lc-ctype=de_DE.UTF-8 zf-company

--------------------------------------
CREATE DATABASE "zf-company"
WITH OWNER = postgres
ENCODING = 'UTF8'
LC_COLLATE = 'POSIX'
LC_CTYPE = 'de_DE.UTF-8'
CONNECTION LIMIT = -1;
--------------------------------------

template1=> \l
List of databases
Name | Owner | Encoding | Collation | Ctype | Access privileges
------------------+----------+----------+-------------+-------------+-----------------------
xxx | admin | UTF8 | de_DE.UTF-8 | de_DE.UTF-8 |
zf-company | postgres | UTF8 | POSIX | de_DE.UTF-8 |


An der Sortierung hat sich aber nichts geändert. :(

in dem Dokument http://wiki.postgresql.org/images/6/63/Fosdem2008_encoding.pdf
ist auf der Seite 5 beschrieben das "DIN 5007-2 phone book" die richtige Sortierung wäre, nur wie stell ich das ein?

Ralf
 
meines Wissens geht das nachträglich auch mit 8.x nicht - bin mir da aber nicht sicher!

Die gängigen Google-Antworten laufen auf das hier hinaus:

You have to perform:

1. database dump,
2. delete database,
3. create database with new encoding,
4. import data from dump created in point 1.

ich würd nen dump nehmen, den in eine neu erstellte DB mit richtigem Encoding laden und dort testen. Klappt das, dann kannst Du die alte DB in _backup umbenennen und der neuen DB den Namen der alten geben und dann müßte relativ schadlos das Problem behoben sein.
 
Die Datenbank zf-company wurde jedes mal gelöscht, ist auch kein Problem da zur Zeit nur Testdaten für UnitTests drin stehen, die schlagen fehl wegen der Sortierung.

Die Frage ist ob ich den ganzen Server mit einem initdb neu einrichten muss.

Ich wüsste nur nicht was ich ändern soll :confused: an den Umgebungsvariablem vom OS X möchte ich nicht unbedingt rumschrauben, und mit de_DE.UTF-8 ist der Server ja schon angelegt.

Ralf
 
so, das Problem hat mir jetzt keine Ruhe gelassen.

Nach viel rumgegoogle habe ich jetzt etwas gefunden. In dem Thread wird das Thema besprochen und ein Begründung geliefert.

http://www.servoy.com/forum/viewtopic.php?f=4&t=11802

------------------

I had to dive into this one a bit, asking around on IRC and finally came up with the answer.
In short: it's an OS issue.

Some BSD versions , like Mac OS X and FreeBSD, can't handle double-byte collation correctly. It defaults to the 'C' collation instead.
Note that the single-byte locale DOES work correctly. It's an double-byte-only (i.e. UTF-8) issue.

There are reports since 2004 (that we could find) that talk about this sort issue with double-byte encodings on Mac OS X.

--------------------

Für mich hat sich die Sache jetzt vorerst mal erledigt, dann nutze ich halt den Linux DB Server :mad:

Falls doch noch jemand eine "richtige" Lösung hat, kann ich immer noch umstellen.

Ralf
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: wegus
Zurück
Oben Unten