Ab PostgreSQL 7.3 wird locale-Unterstützung per Voreinstellung eingeschaltet. Ob sie für eine bestimmte Datenbank verfügbar ist, hängt davon ab, wie initdb ausgeführt und der Server gestartet wurde.
- Sie haben initdb mit einer bestimmten locale gestartet, erhalten jedoch Fehler wie: Failed to initialize lc_monetary to ''
- Beim Starten despostmaster (z.B. mit pg_ctl) bricht es mit Meldungen wie oben bzw.: FATAL: invalid value for option 'LC_MESSAGES': 'de_DE' ab
Wahrscheinlich haben Sie eine locale angeben, die zwar plausibel aussieht, jedoch nicht von Ihrem System unterstützt wird (auch wenn sie auf einem ähnlichen System funktionierte).
Zum Beispiel, initdb -D /path/to/data --locale=de_DE funktioniert unter SuSE Linux aber nicht unter RedHat oder FreeBSD.
Hier müssen Sie feststellen, welche locale-Einstellungen Ihr System unterstützt. Erster Anhaltspunkt ist z.B. das locale-Verzeichnis.
Siehe auch:
http://www.postgresql.org/docs/current/static/multibyte.html
Das locale-Verhalten des Servers hängt davon ab, wie der Server gestartet wurde. Auch wenn keine explizite Angaben an den Server übermittelt wurden, können die Umgebungsvariablen des postgres-Nutzers die locale-Einstellungen beeinflussen.
Ausnahmen: LC_COLLATE und LC_CTYPE sind unveränderlich und können ohne eine erneute Initialisierung der Datenbank mit initdb nicht angepasst werden.
Die festgelegten Werte von LC_COLLATE und LC_CTYPE lassen sich mit pg_controldata anzeigen. (Bitte beachten Sie, daß in PostgreSQL-Versionen vor 7.3 pg_controldata nicht normalerweise installiert wird. Es befindet sich im contrib/-Verzeichnis der Quellen und muss ggf. nachinstalliert werden).
Hierfür gibt es die Funktion to_ascii(), z.B.
SELECT to_ascii('ö', 'LATIN1')
sollte o zurückgeben.
Hinweise:
- Zur Zeit sind nur die Kodierungen LATIN1, LATIN2 and WIN1250 von to_ascii() unterstützt.
- Wenn Sie überwiegend Nicht-ASCII-Kodierungen, z.B. LATIN1 (ISO-8859-1), einsetzen, sollten Sie die richtige locale-Einstellung vornehmen, um z.B. bei Sortiervorgängen die richtige Reihenfolge zu erzielen.
Die folgende Abfrage gibt Ergebnisse in der falschen Reihenfolge zurück:
test=# SELECT nachname FROM leute WHERE nachname LIKE 'M%' ORDER BY nachname; nachname ---------- Mayer Mosel Mueller Muth März Möller Müller
Hier sollte März eigentlich zwischen Mayer und Mosel eingefügt werden.
Die Sortierreihenfolge hängt davon ab, mit welcher locale die PostgreSQL-Installation (database cluster) initialisiert wurde. Damit ORDER BY Wörter mit Umlauten nicht einfach nach hinten verschiebt, sollte bei der Initialisierung des database cluster mit initdb eine de_DE-Locale zumindest für die Variable LC_COLLATE angegeben werden. Dies kann explizit mit den initdb-flags --locale=LOCALE or --lc-collate=LOCALE, bzw. implizit über die passende Umgebungsvariable des ausführenden Users bestimmt werden, z.B. initdb -D /path/to/data --locale=de_DE.ISO_8859-1
Derzeit kann die Lokale-Einstellung LC_COLLATE nur bei der Initialisierung festgelegt werden; eine spätere Anpassung is nur durch das Exportieren der Datenbank in eine korrekt eingerichtete Installation möglich.
Außerdem hat die Datenbank-Kodierung (encoding) keinen direkten Bezug zu der Lokale-Einstellung, d.h. in einer Datenbank, die mit SQL_ASCII erstellt wurde, würden bei passender Locale-Einstellung Umlaute korrekt sortiert.