Oracle Sprachunterstützung mit NLS
Prinzip
Für die Ausgabe und automatische Konvertierung von Datums- und Zahlenwerten sind Defaultformate einstellbar. Die Umgebungsvariablen NLS_LANG, NLS_DATE_FORMAT und NLS_NUMERIC_CHARACTERS bestimmen die Defaultformate. Sind die Variablen NLS_DATE_FORMAT oder NLS_NUMERIC_CHARACTERS nicht gesetzt, werden über NLS_LANG wiederum Defaultwerte hierfür spezifiziert.
Die Einstellung der Variablen erfolgt durch setzen von Shellvariablen, Registry-Einträge oder „alter session“ – Befehls.
Beispiel
alter session set NLS_DATE_FORMAT = ‚dd.mm.yyyy‘;
Aufbau von NLS_LANG
Sprache_Territorium.Zeichensatz
Deutsch | NLS_LANG=GERMAN_GERMANY.WE8ISO8859P1 |
Englisch | NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1 |
Sprache | Sprache der Dialogoberfläche (Meldungen, Menüs, …) |
Territorium | Definiert Defaultwerte für NLS_DATE_FORMAT, NLS_NUMERIC_CHARACTERS und weitere Formate |
Das Territorium bestimmt die Defaultwerte für NLS_DATE_FORMAT und NLS_NUMERIC_CHARACTERS:
GERMANY (Deutsch)
NLS_DATE_FORMAT dd.mm.yy
NLS_NUMERIC_CHARACTERS ,.
AMERICA (Englisch)
NLS_DATE_FORMAT dd-mon-yy
NLS_NUMERIC_CHARACTERS .,
Die Variable NLS_DATE_FORMAT beschreibt das Defaultformat für die Ausgabe und Umwandlung eines Datums.
Beispiel: dd.mm.yyyy
NLS_NUMERIC_CHARACTERS definiert die Zeichen für Tausenderstellen und den Dezimalpunkt:
Deutsch: ,.
Englisch: .,
Achtung bei der impliziten Typkonvertierung:
Eingaben sind immer in englischer Sprache vorzunehmen!
Beispiel (Multiplikation von Preis mit 1,2)
Eingabe | Ausgabe | Bemerkung |
select preis * 1.2 from auftrag_pos; | PREIS*1.2 ———- 1.8 | in Ordnung |
select preis * 1,2 from auftrag_pos; | PREIS*1 2 ———- ——- 1.5 2 | Komma führt zu neuer Spalte |
select preis * ‚1,2‘ from auftrag_pos; | PREIS*’1,2 ———- 1,8 | Konvertierung mit NLS_NUMERIC_CHARACTERS |
Das dritte Beispiel ist nur korrekt, wenn NLS_NUMERIC_CHARACTERS auf ‚,.‘ steht!
Konvertierung mit Angabe von NLS_NUMERIC_CHARACTERS
to_char (zahl, format, nls_format)
to_number (zeichenkette, format, nls_format)
Beispiel
select to_char (anzahl*preis, ‚999G990D00‘, ‚NLS_NUMERIC_CHARACTERS=“,.“‘)
from auftrag_pos
where auftrag_nr = 5;
Umgebungsvariable NLS_SORT
- Bestimmt Sortierreihenfolge
- Default: NLS_LANGUAGE
- Sondereinstellung: binary (Binärkodierung im Datenbankzeichensatz)
Das folgende Beispiel zeigt den Unterschied bei der linguistischen und bei der binären Sortierung:
alter session set nls_sort=german;
select kunden_nr, name1 from kunde order by name1;
Kunden_Nr | Name1 | Kunden_Nr | Name1 | |
1 | Müller | 4 | Meier | |
2 | Muller | => | 2 | Muller |
3 | MÜLLER | 1 | Müller | |
4 | Meier | 3 | MÜLLER | |
5 | MX-GmbH | 5 | MX-GmbH |
alter session set nls_sort=binary;
select kunden_nr, name1 from kunde order by name1;
Kunden_Nr | Name1 | Kunden_Nr | Name1 | |
1 | Müller | 5 | MX-GmbH | |
2 | Muller | => | 5 | Meier |
3 | MÜLLER | 2 | Muller | |
4 | Meier | 3 | MÜLLER | |
5 | MX-GmbH | 1 | Müller |
NLS – Funktionen
Mit den folgenden Funktionen kann unter Angabe der Sprache (oder binär) linguistisch korrekt gearbeitet werden:
NLS_INITCAP(s [,nlsparam]) | initcap mit Sprachangabe |
NLS_LOWER(s [,nlsparam]) | lower mit Sprachangabe |
NLS_UPPER(s [,nlsparam]) | upper mit Sprachangabe |
NLSSORT(s [,nlsparam]) | String von Bytes zum Sortieren |
nlsparam: ‚NLS_SORT=german‘ oder ‚NLS_SORT=binary‘
NLSSORT wandelt eine Zeichenkette in eine Zeichenkette um, die aus einer Anzahl von Bytes in Hexadezimal-Schreibweise besteht:
Beispiele
NLSSORT(‚Ä‘, ‚NLS_SORT=german‘)
Ergebnis: ‚14000A00‘
NLSSORT(‚Ä‘, ‚NLS_SORT=binary‘)
Ergebnis: ‚C400‘
NLSSORT(‚Ä‘, ‚NLS_SORT=ascii7‘)
Ergebnis: ‚0000C400‘
NLSSORT(‚Ä‘, ‚NLS_SORT=french‘)
Ergebnis: ‚14000900‘
Um unabhängig von Umgebungsvariablen zu sein, können damit SQL-Befehle korrekt gestaltet werden:
select kunden_nr, name1
from kunde
order by nlssort(name1, ‚NLS_SORT=german‘);
Kunden_Nr | Name1 | Kunden_Nr | Name1 | |
1 | Müller | 4 | Meier | |
2 | Muller | => | 2 | Muller |
3 | MÜLLER | 1 | Müller | |
4 | Meier | 3 | MÜLLER | |
5 | MX-GmbH | 5 | MX-GmbH |
Damit für diesen Sortiervorgang ein Index benutzt werden kann, sollte ggf. ein function based Index (in 8i nur Enterprise Edition) angelegt werden:
create index idx_kunde_name1 on KUNDE
(nlssort(name1, ‚NLS_SORT=german‘));