TAKTUM Logo


Oracle Schulung
Oracle Schulung

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_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'));



Stichwörter

NLS National Language Support NLS_LANG NLS_DATE_FORMAT NLS_NUMERIC_CHARACTERSGERMAN_GERMANY.WE8ISO8859P1 AMERICAN_AMERICA.WE8ISO8859P1 NLS_LANGUAGE NLS_INITCAP NLS_LOWER NLS_UPPER NLSSORT NLS_SORT Beispiel Beispiele