sql-info.de
DeutschEnglish

5. Lokalisierung / Internationalisierung

5.1. Muss ich bei der Kompilierung --enable-locale angeben, um locale-Unterstützung zu ermöglichen?

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.

5.2. Warum lösen meine locale-Einstellungen Fehler aus?

  • 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

5.3. Wie stelle ich fest, welche locale für einen bestimmten Datenbank-Cluster definiert ist?

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

5.4. Wie kann ich ein Zeichen mit einer diakritischen Marke (Umlaut, Cedille usw.) ohne diese Marke ausgeben lassen?

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.

5.5. Wie kann ich in der richtigen Reihenfolge für eine bestimmte Sprache, z.B. Deutsch, sortieren lassen?

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.


Kommentare
i want to insert my sql table in postgres

please reply me soon
Posted by: santhosh | 2007-7-30 06:56