Oracle SQL Tutorial: NLS (National Language Support)

Oracle Sprachunterstützung mit NLS

Prinzip

Für die Ausgabe und automatische Konvertierung von Datums- und Zahlenwerten sind Defaultformate einstellbar. Die Umgebungsvariablen NLS_LANGNLS_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

DeutschNLS_LANG=GERMAN_GERMANY.WE8ISO8859P1
EnglischNLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
SpracheSprache der Dialogoberfläche (Meldungen, Menüs, …)
TerritoriumDefiniert 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)

EingabeAusgabeBemerkung
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_NrName1 Kunden_NrName1
1Müller 4Meier
2Muller=>2Muller
3MÜLLER 1Müller
4Meier 3MÜLLER
5MX-GmbH 5MX-GmbH

alter session set nls_sort=binary;

select kunden_nr, name1 from kunde order by name1;

Kunden_NrName1 Kunden_NrName1
1Müller 5MX-GmbH
2Muller=>5Meier
3MÜLLER 2Muller
4Meier 3MÜLLER
5MX-GmbH 1Mü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_NrName1 Kunden_NrName1
1Müller 4Meier
2Muller=>2Muller
3MÜLLER 1Müller
4Meier 3MÜLLER
5MX-GmbH 5MX-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‘));