Ein Gebietsschema ist ein Satz von Informationen, die sprachliche und kulturelle Anforderungen für eine bestimmte Sprache und ein bestimmtes Land enthalten. Normalerweise bieten die mit einem Gebietsschema verknüpften Daten Unterstützung für Formatierung und Analyse von Datums-, Uhrzeit-, Zahlen- und Währungsangaben usw. Die Bereitstellung aktueller und korrekter Gebietsschemadaten lag in der Vergangenheit in der Verantwortung der einzelnen Plattformbesitzer oder -verkäufer, was zu Inkonsistenzen und Fehlern bei Gebietsschemadaten führte.
Das Festlegen der NLS_LANG-Umgebungsparameter ist die einfachste Möglichkeit, das Gebietsschemaverhalten für Software von Oracle anzugeben. Hiermit werden Sprache und Gebiet festgelegt, die von der Clientanwendung und dem Datenbankserver verwendet werden. Außerdem ist auch der Clientzeichensatz angegeben, der dem Zeichensatz für Daten entspricht, die von einem Clientprogramm eingegeben oder angezeigt werden sollen.
NLS_LANG wird auf UNIX-Plattformen als lokale Umgebungsvariable festgelegt. NLS_LANG wird in der Registry auf Windows-Plattformen festgelegt.
Der Parameter NLS_LANG besteht aus drei Komponenten: Sprache, Gebiet und Zeichensatz. Geben Sie dies einschließlich der Interpunktion im folgenden Format an:
NLS_LANG = language_territory.charset
Jede Komponente des NLS_LANG-Parameters steuert den Betrieb einer Teilmenge der Funktionen zur Unterstützung der Globalisierung:
Language
Gibt Konventionen an, z. B. die Sprache für Oracle Nachrichten, Sortierung, Tages- und Monatsnamen. Jede unterstützte Sprache hat einen eindeutigen Namen, wie z. B.: AMERICAN, FRENCH oder GERMAN. Das Sprachargument gibt Standardwerte für die Gebiets- und Zeichensatzargumente an. Wenn die Sprache nicht angegeben ist, wird standardmäßig AMERICAN verwendet.
Territory
Gibt Konventionen wie das Standardformat für Datum, Geld und Zahlen an. Jedes unterstützte Gebiet hat einen eindeutigen Namen, wie z. B.: AMERICA, FRANCE oder CANADA. Wenn das Gebiet nicht angegeben ist, wird der Wert aus dem Sprachwert abgeleitet.
Charset
Gibt den von der Clientanwendung verwendeten Zeichensatz an (normalerweise der Oracle Zeichensatz, der dem Terminal- oder OS-Zeichensatz des Benutzers entspricht). Jeder unterstützte Zeichensatz hat ein eindeutiges Akronym, z. B. US7ASCII, WE8ISO8859P1, WE8DEC, WE8MSWIN1252 oder JA16EUC. Jeder Sprache ist ein Standardzeichensatz zugeordnet.
Hinweis:
Alle Komponenten der NLS_LANG
-Definition sind optional. Jedes Element, das nicht angegeben wird, verwendet seinen Standardwert. Wenn Sie ein Gebiet oder einen Zeichensatz angeben, müssen Sie das vorangestellte Trennzeichen [Unterstrich (_) für das Gebiet, Punkt (.) für den Zeichensatz] einfügen. Andernfalls wird der Wert als Sprachenname analysiert.
Verwenden Sie beispielsweise das folgende Format, um nur den Gebietsabschnitt von NLS_LANG
festzulegen: NLS_LANG=_JAPAN
Der Rest dieses Dokuments konzentriert sich auf die Zeichensatzkomponente der NLS_LANG-Einstellung, da dies das am wenigsten verstandene und wichtigste Element ist, das richtig eingestellt werden muss.
In vielen Fällen wurde NLS_LANG bereits während der Installation von Oracle oder danach manuell festgelegt. Um sicherzugehen, können Sie diese Methoden verwenden, um den Wert von NLS_LANG für SQL*Plus zurückzugewinnen:
Unter UNIX:
SQL> HOST ECHO $NLS_LANG
Dies gibt den Wert des Parameters zurück.
Unter Windows:
Unter Windows haben Sie zwei Möglichkeiten. Normalerweise wird NLS_LANG in der Registry festgelegt, es kann jedoch auch in der Umgebung festgelegt werden. Dies wird jedoch nicht häufig durchgeführt. Der Wert in der Umgebung hat Vorrang vor dem Wert in der Registry und wird für ALLE Oracle_Homes auf dem Server verwendet. Beachten Sie außerdem, dass jede USER-Umgebungsvariable beim Festlegen Vorrang vor jeder SYSTEM-Umgebungsvariablen hat (dies ist Windows-Verhalten und hat nichts mit Oracle zu tun)
So überprüfen Sie, ob dies in der Umgebung festgelegt ist:
SQL> HOST ECHO %NLS_LANG%
Wenn dies nur %NLS_LANG% zurückgibt, ist die Variable nicht in der Umgebung festgelegt.
Andernfalls wird in etwa Folgendes zurückgegeben
ENGLISH_UNITED KINGDOM.WE8ISO8859P1
Wenn NLS_LANG in der Umgebung nicht festgelegt ist, überprüfen Sie den Wert in der Registry:
SQL>@.[%NLS_LANG%].
Beispiel:
Unable to open file.[ENGLISH_UNITED KINGDOM.WE8ISO8859P1].
Der "Dateiname" zwischen den geschweiften Klammern steht für den Wert des Registry-Parameters.
Wenn Sie
Unable to open file ".[%NLS_LANG%]." als Ergebnis erhalten, ist der Parameter NLS_LANG auch nicht in der Registry festgelegt.
Beachten Sie, dass die @.[%NLS_LANG%].-Technik meldet, dass die NLS_LANG, die der ausführbaren SQL*Plus-Datei bekannt ist, die Registry selbst nicht liest. Wenn Sie jedoch zuerst den HOST-Befehl ausführen und NLS_LANG nicht in der Umgebung festgelegt ist, können Sie sicher sein, dass die Variable in der Registry festgelegt ist, wenn @.[%NLS_LANG%]. einen gültigen Wert zurückgibt.
Alle anderen NLS-Parameter können wie folgt abgerufen werden:
SELECT * FROM NLS_SESSION_PARAMETERS;
Hinweis:
SELECT USERENV ( 'Sprache') FROM DUAL; gibt <Language>_<territory> der Sitzung zurück, der DATABASE-Zeichensatz legt jedoch den Client nicht fest, sodass der zurückgegebene Wert nicht die vollständige NLS_LANG-Einstellung des Clients ist!
In diesem Abschnitt wird die Reihenfolge erläutert, in der NLS-Parameter im Client/Server-Modell der Datenbank berücksichtigt werden. (Dies gilt NICHT für Thin JDBC-Verbindungen.)
Es gibt 3 Ebenen, auf denen Sie NLS-Parameter festlegen können: Datenbank, Instanz und Sitzung. Wenn ein Parameter auf mehr als einer Ebene definiert ist, sind die Regeln, auf denen er Vorrang hat, recht einfach:
SELECT * from NLS_SESSION_PARAMETERS;
Dies sind die Einstellungen, die für die aktuelle SQL-Sitzung verwendet werden.
Diese geben (in dieser Reihenfolge) Folgendes wieder:
Wenn Sie also NLS_LANG=_BELGIUM. WE8MSWIN1252 festlegen, erhalten Sie Folgendes:
PARAMETERWERT
NLS_LANGUAGE AMERICAN
NLS_TERRITORY BELGIUM
NLS_CURRENCY <Euro-Zeichen hier>
NLS_ISO_CURRENCY BELGIUM
Hinweis:
Der Unterschied zwischen NLS_LANG=_BELGIUM.WE8MSWIN1252 (korrekt) und
NLS_LANG=BELGIUM.WE8MSWIN1252 (falsch) liegt im fehlenden Trennzeichen „_“.
Wenn Sie also NLS_LANG=ITALIAN_.WE8MSWIN1252 festlegen, erhalten Sie Folgendes:
PARAMETERWERT
NLS_LANGUAGE ITALIAN
NLS_TERRITORY ITALY
NLS_CURRENCY <Euro-Zeichen hier>
NLS_ISO_CURRENCY ITALY
Hinweis:
Der Unterschied zwischen NLS_LANG=ITALIAN_.WE8MSWIN1252 (korrekt) und
NLS_LANG=ITALIAN.WE8MSWIN1252 (falsch) liegt im fehlenden Trennzeichen „_“.
Wenn Sie also NLS_LANG=.WE8MSWIN1252 festlegen, erhalten Sie Folgendes:
PARAMETERWERTNLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
Note:
The difference between NLS_LANG=.WE8MSWIN1252 (correct) and
NLS_LANG=WE8MSWIN1252 (incorrect), you need to set the "." as separator.
NLS_SORT, NLS_DATE_FORMAT usw. als "eigenständige" Einstellung festgelegt und überschreiben die vom NLS_LANG _-Teil abgeleiteten Standardeinstellungen.
Wenn Sie also NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252 und NLS_ISO_CURRENCY=FRANCE festlegen, erhalten Sie Folgendes:
PARAMETERWERT
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY FRANCE
Standartwerte:
* Wenn NLS_DATE_LANGUAGE oder NLS_SORT nicht festgelegt sind, werden sie von
NLS_LANGUAGE.
abgeleitet. * Wenn NLS_CURRENCY, NLS_DUAL_CURRENCY, NLS_ISO_CURRENCY, NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT, NLS_TIMESTAMP_TZ_FORMAT, NLS_NUMERIC_CHARACTERS nicht festgelegt sind, werden sie von NLS_TERRITORY abgeleitet.
<Language>_<Territory>.US7ASCII und die Werte für den
<Language>_<Territory>-Teil werden aus den
NLS_INSTANCE_PARAMETERS entnommen. Parameter wie NLS_SORT, die clientseitig als "eigenständig" definiert sind, werden ignoriert.
Note:
* If set, client parameters (NLS_SESSION_PARAMETERS) always take precedence over NLS_INSTANCE_PARAMETERS and NLS_DATABASE_PARAMETERS.
* This behavior cannot be disabled on/from the server, so a parameter set on the client always has precedence above an instance or database parameter.
* NLS_LANG cannot be changed by ALTER SESSION, NLS_LANGUAGE and NLS_TERRITORY can. However NLS_LANGUAGE and /or NLS_TERRITORY cannot be set as "standalone" parameters in the environment or registry on the client.
* NLS_SESSION_PARAMETERS is NOT visible for other sessions. If you need to trace this then you have to use a logon trigger to create your own logging table (based on session parameters)
* The <clients characterset> part of NLS_LANG is NOT shown in any system table or view.
* On Windows you have two possible options, normally the NLS_LANG is set in the registry, but it can also be set in the environment, however this is not often done and generally not recommended to do so. The value in the environment takes precedence over the value in the registry and is used for ALL Oracle_Homes on the server if defined as a system environment variable.
* NLS_LANGUAGE in the session parameters also declares the language for the client error messages.
* You cannot "set" a NLS parameter in an SQL script; you need to use ALTER SESSION.
SELECT * from NLS_INSTANCE_PARAMETERS;
Dies sind die Einstellungen in der init.ora der Datenbank zum Zeitpunkt des Starts oder der Einstellung der Datenbank über ALTER SYSTEM.
Wenn der Parameter nicht explizit in der init.ora festgelegt oder von ALTER SYSTEM definiert wurde, wird sein Wert NICHT von einem "höheren" Parameter abgeleitet. (Es handelt sich um Parameter wie NLS_SORT, die einen Standardwert von NLS_LANGUAGE in NLS_SESSION_PARAMETERS ableiten. Dies ist NICHT der Fall für NLS_INSTANCE_PARAMETERS.)
Note:
* NLS_LANG is not an init.ora parameter; NLS_LANGUAGE and NLS_TERRITORY are so you need to set NLS_LANGUAGE and NLS_TERRITORY separately.
* You cannot define the or NLS_LANG in the init.ora
The client characterset is defined by the NLS_LANG on the client OS (see above).
* You cannot define the database characterset in the init.ora. The database characterset is defined by the "Create Database" command.
* These settings take precedence above the NLS_DATABASE_PARAMETERS.
* These values are used for the NLS_SESSION_PARAMETERS if the client the
NLS_LANG is NOT set.
* Oracle strongly recommends that you set the NLS_LANG on the client at least to
NLS_LANG=.<clients characterset>
* The NLS_LANGUAGE in the instance parameters also declares the language for the server error messages in alert.log and in trace files.
SELECT * from NLS_DATABASE_PARAMETERS;
Der Standardwert ist AMERICAN_AMERICA, wenn während der Datenbankerstellung in init.ora keine expliziten Parameter festgelegt wurden. Wenn während der Datenbankerstellung in der init.ora Parameter festgelegt wurden, sehen Sie diese hier. Es gibt keine Möglichkeit, diese nach der Datenbankerstellung zu ändern. Versuchen Sie NICHT, Systemtabellen zu aktualisieren, um diese Einstellungen zu umgehen! Diese Einstellungen werden verwendet, um der Datenbank einen Standard zu geben, wenn die Parameter INSTANCE und SESSION nicht festgelegt sind.
Hinweis:
* NLS_LANG ist kein init.ora-Parameter, NLS_LANGUAGE und NLS_TERRITORY sind dies jedoch.
Daher müssen Sie NLS_LANGUAGE und NLS_TERRITORY separat festlegen.
* Diese Parameter werden von NLS_INSTANCE_PARAMETERS und NLS_SESSION_PARAMETERS überschrieben.
* Sie können <clients character set> oder NLS_LANG nicht in der init.ora definieren. Der Clientzeichensatz wird durch NLS_LANG auf dem Clientbetriebssystem definiert.
* Sie können den Datenbankzeichensatz nicht in der init.ora definieren.
Der (landeseigene) Datenbankzeichensatz NLS_(NCHAR)_CHARACTERSET) wird durch den Befehl "Create Database" definiert.
* Die Parameter NLS_CHARACTERSET und NLS_NCHAR_CHARACTERSET können nicht durch Instanz- oder Sitzungsparameter überschrieben werden.
Sie werden durch den im CREATE DATABASE-Befehl angegebenen Wert definiert und sollen danach nicht dynamisch geändert werden. Aktualisieren Sie die Systemtabellen NICHT, um den Zeichensatz zu ändern. Dies kann Ihre Datenbank beschädigen und möglicherweise das erneute Öffnen der Datenbank unmöglich machen.
* Das Festlegen von NLS_LANG während der Erstellung der Datenbank hat keinen Einfluss auf NLS_DATABASE_PARAMETERS.
* Die während der Datenbankerstellung festgelegte NLS_LANG hat KEINE Auswirkungen auf den Länderzeichensatz der Datenbank.
Weitere SELECT-Anweisungen:
A) SELECT name,value$ from sys.props$, wobei ein Name wie '%NLS%' angegeben wird.
Dies gibt die gleichen Informationen wie NLS_DATABASE_PARAMETERS aus.
Sie sollten NLS_DATABASE_PARAMETERS anstelle von props$ verwenden.
Beachten Sie die Großschreibung bei '%NLS%'
B) SELECT * from v$nls_parameters;
Diese Sicht zeigt die aktuellen Sitzungsparameter und den *DATABASE*-Zeichensatz in der Sicht NLS_DATABASE_PARAMETERS.
C) SELECT name,value from v$parameter, wobei ein Name wie '%NLS%' angegeben wird.
Diese Sicht gibt die gleichen Informationen wie NLS_INSTANCE_PARAMETERS aus.
Beachten Sie die Kleinschreibung bei '%NLS%'
D) SELECT userenv ('language') from dual;
und
SELECT sys_context('userenv','language') from dual;
Beide SELECT-Anweisungen geben den _ der Sitzung und den
DATABASE-Zeichensatz an. Der Datenbankzeichensatz stimmt nicht mit dem Zeichensatz des NLS_LANG überein, mit dem Sie diese Verbindung gestartet haben! Lassen Sie sich nicht täuschen, auch wenn die Ausgabe dieser Abfrage wie der Wert einer NLS_LANG-Variablen aussieht, ist dies NICHT der Fall.
E) SELECT userenv ('lang') from dual;
Diese SELECT-Anweisung gibt den Funktionscode an, den Oracle für die Sprache verwendet, die in der NLS_LANGUAGE-Einstellung für diese Sitzung definiert ist. Wenn NLS_LANGUAGE auf Französisch gesetzt ist, wird "F" zurückgegeben. Wenn NLS_LANGUAGE auf Englisch eingestellt ist, wird "GB" zurückgegeben.
Wenn NLS_LANGUAGE auf Amerikanisch eingestellt ist, wird "US" zurückgegeben usw...
F) SHOW parameter NLS%
Dies ergibt dasselbe wie NLS_INSTANCE_PARAMETERS
Auf einem UNIX-System wird eine Datenbank mit dem Zeichensatz US7ASCII erstellt. Ein Windows-Client, der eine Verbindung zur Datenbank herstellt, verwendet den Zeichensatz WE8MSWIN1252 (regionale Einstellungen –> Westeuropa/ACP 1252) und DBA sowie die UNIX-Shell (ROMAN8) zur Funktion mit der Datenbank. NLS_LANG ist auf den Clients und dem Server auf american_america.US7ASCII eingestellt.
Note:
This is an INCORRECT setup to explain character set conversion, don't use it in your environment!
Ein sehr wichtiger Punkt (wie bereits erwähnt):
Wenn für den NLS_LANG-Zeichensatz des Clients derselbe Wert wie für den Datenbankzeichensatz festgelegt ist, geht Oracle davon aus, dass die gesendeten oder empfangenen Daten dieselbe (korrekte) Codierung aufweisen, sodass aus Performance-Gründen keine Konvertierungen oder Überprüfungen auftreten können. Die Daten werden so gespeichert, wie sie vom Client geliefert wurden, Stück für Stück.
Unter Windows fügen Sie ein ‘é’ (Lateinischer Kleinbuchstabe E mit Akut) in eine Tabelle NLS_TEST ein, die eine Spalte ‘TEST’ vom Typ 'char' enthält.
Solange Sie unter Windows mit dem Zeichensatz WE8MSWIN1252 in die Spalte einfügen und aus dieser auswählen, funktioniert alles reibungslos. Es wird keine Konvertierung durchgeführt und 8 Bits werden eingefügt und zurückgelesen, selbst wenn der Zeichensatz der Datenbank als 7 Bits definiert ist. Dies geschieht, weil ein Byte 8 Bits umfasst und Oracle IMMER 8 Bits verwendet, auch wenn ein 7-Bit-Zeichensatz vorhanden ist. Bei einer korrekten Einstellung wird das höchstwertige Bit einfach nicht verwendet und nur 7 Bits werden berücksichtigt.
Wenn Sie vom UNIX-Server einfügen müssen. Wenn Sie mit SELECT aus Tabellen auswählen, in die Daten von Windows-Clients eingefügt wurden, erhalten Sie ein ‘Ò’ (Lateinischer Großbuchstabe O mit Tilde) anstelle von ‘é’.
Wenn Sie auf dem UNIX-Server ‘é’ einfügen und die Zeile per SELECT auf dem Windows-Client auswählen, erhalten Sie ein ‘Å’ (Lateinischer Großbuchstabe A mit Ring oben).
Dies alles sorgt jedoch für INKORREKTE Daten in der Datenbank. Sie speichern den numerischen Wert für 'é' des WE8MSWIN1252-Zeichensatzes in der Datenbank, aber Sie sagen Oracle, dass es sich um US7ASCII-Daten handelt. Somit konvertiert Oracle nichts und speichert nur den numerischen Wert (nochmals: Oracle denkt, dass der Client US7ASCII-Codes gibt da NLS_LANG auf US7ASCII eingestellt ist und der Datenbankzeichensatz ebenfalls US7ASCII ist -> es wird keine Konvertierung durchgeführt).
Wenn Sie dieselbe Spalte wieder auf dem UNIX-Server per SELECT auswählen, erwartet Oracle erneut, dass der Wert korrekt ist, und übergibt den Wert ohne Konvertierung an das UNIX-Terminal.
Jetzt besteht das Problem darin, dass ‘é’ im WE8MSWIN1252-Zeichensatz den hexadezimalen Wert 'E9' hat, und im Roman8-Zeichensatz hat ‘é’ den Hexadezimalwert 'C5'. Oracle übergibt nur den in der Datenbank gespeicherten Wert ('E9') an das UNIX-Terminal, und das UNIX-Terminal geht davon aus, dass dies das Zeichen ‘?’ ist, da im festgelegten Zeichensatz (Roman8) der Hexadezimalwert 'E9' für den Buchstaben ‘Ò’ steht. Statt des ‘é’ erhalten Sie demnach ein ‘Ò’ auf dem UNIX-Terminal-Bildschirm.
Mit der Umkehrung (die Einfügung unter UNIX und die Auswahl auf dem Windows-Client) verhält es sich genau, jedoch mit anderen Ergebnissen.
Die Lösung besteht darin, die Datenbank mit einem Zeichensatz zu erstellen, der ‘é’ enthält.
(WE8MSWIN1252, WE8ISO89859P1, UTF-8 usw.) und NLS_LANG auf dem Client auf WE8MSWIN1252 und auf dem Server auf WE8ROMAN8 festlegt. Wenn Sie dann auf beiden Seiten ein ‘é’ einfügen, erhalten Sie ein ‘é’, unabhängig davon, wo Sie SELECT ausführen. Oracle weiß dann, dass ein hexadezimaler Wert von 'C5 von UNIX und ein 'E9 von einem WE8MSWIN1252-Client beide ein ‘é’ sind und fügt ‘é’ in die Datenbank ein (der Code in der Datenbank hängt vom gewählten Zeichensatz ab).
Sie müssen nicht zwischen UNIX-, Windows- oder anderen Betriebssystemclients wechseln, um auf diese Art von Problem zu stoßen. Das gleiche Problem tritt auf, wenn Sie Windows-Clients hinzufügen, die einen anderen Zeichensatz verwenden und einen falschen NLS_LANG-Satz haben.
Um das Gebietsschemaverhalten Ihrer Clientsoftware von Oracle festzulegen, müssen Sie Ihren NLS_LANG-Parameter festlegen. Dieser legt die Sprache, das Gebiet und auch den Zeichensatz des Clients fest. Sie müssen die Ländereinstellungen überprüfen, um das dritte NLS_LANG-Feld (Zeichensatz) entsprechend einzustellen. Verwenden Sie dazu den Befehl "locale" wie folgt:
$ locale
Example of output:
LANG=fr_FR
LC_CTYPE="fr_FR.iso885915@euro"
LC_COLLATE="fr_FR.iso885915@euro"
LC_MONETARY="fr_FR.iso885915@euro"
LC_NUMERIC="fr_FR.iso885915@euro"
LC_TIME="fr_FR.iso885915@euro"
LC_MESSAGES="fr_FR.iso885915@euro"
LC_ALL=fr_FR.iso885915@euro
Die Ausgabe dieses Befehls ist nicht in allen Unix-Umgebungen identisch. Auf einigen Plattformen kann es hilfreich sein, die folgende Syntax zu verwenden, um weitere Details zur tatsächlich verwendeten Codepage zu erhalten:
$ locale LC_CTYPE | head
Example of output
in a HP-UX environment
:
""
""
"iso885915"
""
Example of output in a Linux environment:
upper;lower;alpha;digit;xdigit;space;print;graph;blank;cntrl;
punct;alnum;
combining;combining_level3
toupper;tolower;totitle
16
1
ISO-8859-15
70
84
1
0
In diesen Fällen sollte das dritte NLS_LANG-Feld auf WE8ISO8859P15 gesetzt werden. Unter Solaris, AIX und TRU64 liefert diese Syntax keine interessanten ergänzenden Informationen. Weitere Details zu diesen Einstellungen finden Sie hier:
Suchen Sie unter Solaris in /usr/lib/locale
Suchen Sie unter AIX in /usr/lib/nls/README
Suchen Sie auf TRU64 in /usr/lib/nls
Suchen Sie unter HP-UX in /usr/lib/nls/config
Suchen Sie unter Linux in /usr/share/locale/locale.alias
Zum Festlegen eines ausgewählten Werts für die "locale"-Einstellungen, müssen Sie wissen, welche Werte verfügbar sind. Verwenden Sie dazu die folgende Syntax:
$ locale -a
Wenn Sie dann einen Wert ausgewählt haben, z. B. UTF-8 unter Linux, können Sie diesen folgendermaßen festlegen:
$ export LC_ALL=UTF-8
oder
% setenv LC_ALL UTF-8
Example of output after the setenv:
$ locale
LANG=fr_FR
LC_CTYPE="UTF-8"
LC_NUMERIC="UTF-8"
LC_TIME="UTF-8"
LC_COLLATE="UTF-8"
LC_MONETARY="UTF-8"
LC_MESSAGES="UTF-8"
LC_PAPER="UTF-8"
LC_NAME="UTF-8"
LC_ADDRESS="UTF-8"
LC_TELEPHONE="UTF-8"
LC_MEASUREMENT="UTF-8"
LC_IDENTIFICATION="UTF-8"
LC_ALL=UTF-8
$ locale LC_CTYPE | head
upper;lower;alpha;digit;xdigit;space;print;
graph;blank;cntrl;punct;alnum;combining;combining_level3
toupper;tolower;totitle
16
6
UTF-8
70
84
1
0
1
In diesem Fall sollte das 3. Feld (Zeichensatz) von NLS_LANG auf UTF8 gesetzt werden.
% setenv NLS_LANG American_America.UTF8
Auf Windows-Systemen wird das Codierungsschema (Zeichensatz) durch eine Codepage angegeben. Codepages werden so definiert, dass sie bestimmte Sprachen oder Sprachgruppen unterstützen, die gemeinsame Schriftsysteme verwenden. Aus der Sicht von Oracle bedeuten die Begriffe Codepage und Zeichensatz dasselbe. Beachten Sie, dass in Umgebungen ohne Chinesisch, Japanisch, Koreanisch die Windows-GUI und die DOS-Eingabeaufforderung nicht dieselbe Codepage verwenden.
Infolgedessen verwendet Windows zwei verschiedene Zeichensätze für die Umgebungen ANSI (sqlplusw.exe) und OEM (dos box – sqlplus.exe).
In der Registry:
Unter Windows-Systemen sollten Sie sicherstellen, dass Sie für jedes Ihrer Oracle Homes einen NLS_LANG-Registry-Unterschlüssel festgelegt haben:
Mit dem Windows Registry-Edito können Sie diesen Unterschlüssel problemlos ändern:
Start -> Ausführen ...
Geben Sie „regedit“ ein und klicken Sie anschließend auf „OK“
Bearbeiten Sie den folgenden Registry-Eintrag:
Für Oracle Version 7:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
Für die Oracle Database-Versionen 8, 8i und 9i:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEx\
wobei "x" für die eindeutige Nummer steht, die das Oracle Home identifiziert.
HOME0 ist die erste Installation
Für Oracle Database 10g:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_
Dort finden Sie einen Eintrag mit dem Namen NLS_LANG
Beim Starten eines Oracle Tools wie SQL*Plusw wird der Inhalt der Datei oracle.key gelesen, die sich im selben Verzeichnis befindet, um zu bestimmen, welcher Registry-Baum verwendet wird und somit auch welcher NLS_LANG-Unterschlüssel verwendet wird.
Hinweis:
Einige Benutzer sind verwirrt, wenn sie einen NLS_LANG vorfinden, der in HKEY_LOCAL_MACHINE\SOFTWARE\Oracle auf "NA" festgelegt ist, wenn keine Version 7 installiert war. Dies erfolgt aus Gründen der Abwärtskompatibilität und kann ignoriert werden.
Als System- oder Nutzer-Umgebungsvariable in den Systemeigenschaften:
Die Registry ist zwar das primäre Repository für Einstellungen unter Windows, aber nicht der einzige Ort, an dem Parameter festgelegt werden können. Auch wenn dies nicht empfohlen wird, können Sie NLS_LANG in den Systemeigenschaften als System- oder Nutzer-Umgebungsvariable festlegen.
Diese Einstellung wird für ALLE Oracle Homes verwendet.
So überprüfen und ändern Sie dies:
Klicken Sie mit der rechten Maustaste auf das Symbol 'Arbeitsplatz ->'Eigenschaften'
Wählen Sie die 'Registerkarte „Erweitert“ -> Klicken Sie auf 'Umgebungsvariablen'
Die Liste der 'Nutzer-Variablen enthält die Einstellungen für den aktuell angemeldeten Betriebssystembenutzer und die 'Systemvariablen enthalten systemweite Variablen für alle Benutzer.
Da diese Umgebungsvariablen Vorrang vor den in Ihrer Registry bereits festgelegten Parametern haben, sollten Sie an dieser Stelle keine Oracle Parameter festlegen, es sei denn, Sie haben einen sehr guten Grund.
Als Umgebungsvariable, die in der Eingabeaufforderung definiert ist:
Bevor Sie ein Oracle Befehlszeilentool verwenden können, müssen Sie den NLS_LANG-Parameter MANUELL festlegen. Verwenden Sie an einer MS-DOS-Eingabeaufforderung den Befehl set, zum Beispiel wie folgt:
C:\> set NLS_LANG=american_america.WE8PC850
Nachdem Sie wissen, auf was NLS_LANG momentan eingestellt ist, können Sie überprüfen, ob dies mit der aktuellen ANSI-Codepage übereinstimmt. Die ACP (ANSI-Codepage) wird durch das "Standardgebietsschema" von Windows definiert. Wenn Sie also einen britischen Windows 2000-Client nutzen und Kyrillisch (Russisch) eingeben möchten, müssen Sie die ACP ändern (indem Sie das "Standardgebietsschema" ändern), um Russisch eingeben zu können.
Sie finden den Wert in der Registry:
Start –> Ausführen...
Geben Sie "regedit" ein, und klicken Sie auf "ok"
Durchsuchen Sie den folgenden Registry-Eintrag:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NLS\CodePage\
Dort finden Sie (ganz unten) einen Eintrag mit dem Namen ACP. Der Wert von ACP stellt die aktuelle GUI-Codepage für die Zuordnung zum Namen Oracle dar. Da es viele Registry-Einträge mit sehr ähnlichen Namen gibt, vergewissern Sie sich, dass Sie sich an der richtigen Stelle in der Registry befinden.
Darüber hinaus enthält die folgende URL eine Liste der Standardcodepages für alle Windows-Versionen:
http://www.microsoft.com/globaldev/reference/
(unter der Registerkarte REFERENZ links auf der Seite)
OEM = die Befehlszeilen-Codepage, ANSI = die GUI-Codepage
Beachten Sie, dass hier Hongkong HKSCS aufgelistet ist: http://www.microsoft.com/hk/hkscs/
Suchen Sie den entsprechenden Oracle Clientzeichensatz:
Suchen Sie den Oracle Clientzeichensatz in der folgenden Tabelle, basierend auf der oben gefundenen ACP. Beachten Sie, dass es für eine bestimmte ACP nur EINEN KORREKTEN Wert gibt.
ANSI CodePage (ACP) | Oracle Clientzeichensatz (3. Teil von NLS_LANG) |
---|---|
1250 |
EE8MSWIN1250 |
1251 |
CL8MSWIN1251 |
1252 |
WE8MSWIN1252 |
1253 |
EL8MSWIN1253 |
1254 |
TR8MSWIN1254 |
1255 |
IW8MSWIN1255 |
1256 |
AR8MSWIN1256 |
1257 |
BLT8MSWIN1257 |
1258 |
VN8MSWIN1258 |
874 |
TH8TISASCII |
932 |
JA16SJIS |
936 |
ZHS16GBK |
949 |
KO16MSWIN949 |
950 |
ZHT16MSWIN950 – außer für Hongkong (siehe unten) |
Dies ist der Zeichensatz, der von der GUI SQL*Plus (sqlplusW.exe/plus80W.exe/plus33W.exe) verwendet wird, die Sie über das Windows-Startmenü starten. Bitte beachten Sie den Unterschied zwischen der GUI SQL*Plus und "DOS-Modus" SQL*Plus.
Sie können UTF8 unter Windows NT, 2000 und XP als Oracle Clientzeichensatz (=NLS_LANG) verwenden. Sie dürfen jedoch nur Clientprogramme verwenden, die diese Konfiguration ausdrücklich unterstützen. Dies liegt daran, dass die Benutzeroberfläche von Win32 nicht UTF8 ist. Daher muss das Clientprogramm explizite Konvertierungen zwischen UTF8 (auf der Seite von Oracle verwendet) und UTF16 (auf der Seite von Win32 verwendet) durchführen.
Legen Sie dies in der Registry fest:
Verwenden Sie den Windows-Registry-Editor, um NLS_LANG in Ihrem Oracle Home mit dem Wert einzurichten, den Sie soeben gefunden haben.
Der MS-DOS-Modus verwendet mit wenigen Ausnahmen wie CJK (Japanisch, Koreanisch, vereinfachtes Chinesisch und traditionelles Chinesisch) eine andere Codepage (als OEM-Codepage bezeichnet) als die Windows-GUI (ANSI-Codepage). Das heißt, bevor Sie ein Oracle Befehlszeilentool wie SQL*Plus (sqlplus.exe/plus80.exe/plus33.exe) und svrmgrl in einer Eingabeaufforderung verwenden, müssen Sie den Parameter NLS_LANG MANUELL als Umgebungsvariable mit dem festgelegten DOS-Wert festlegen, BEVOR Sie das Tool verwenden.
Für Japanisch, Koreanisch, vereinfachtes Chinesisch und traditionelles Chinesisch ist die MS-DOS-OEM-Codepage (CJK) mit der ANSI-Codepage identisch, sodass in diesem speziellen Fall der NLS_LANG-Parameter nicht im MS-DOS-Modus festgelegt werden muss.
In allen anderen Fällen müssen Sie dies festlegen, um den NLS_LANG-Registry-Schlüssel zu überschreiben, der bereits mit der ANSI-Codepage übereinstimmt. Die neue "dedizierte MS-DOS"-NLS_LANG muss mit der MS-DOS-OEM-Codepage übereinstimmen, die durch Eingabe von chcp in einer Eingabeaufforderung abgerufen werden kann:
C:\> chcp
Aktive Codepage: 437
C:\> set NLS_LANG=american_america.US8PC437
Wenn der NLS_LANG-Parameter für die Sitzung im MS-DOS-Modus nicht ordnungsgemäß festgelegt ist, können Fehlermeldungen und Daten aufgrund einer falschen Zeichensatzkonvertierung beschädigt werden.
Verwenden Sie die folgende Liste, um den Oracle Zeichensatz zu finden, der zu Ihrer auf Ihrem Gebietsschemasystem verwendeten MS-DOS-Codepage passt:
MS-DOS-Codepage | Oracle Clientzeichensatz (3. Teil von NLS_LANG) |
---|---|
437 |
US8PC437 |
737 |
EL8PC737 |
850 |
WE8PC850 |
852 |
EE8PC852 |
857 |
TR8PC857 |
858 |
WE8PC858 |
861 |
IS8PC861 |
862 |
IW8PC1507 |
865 |
N8PC865 |
866 |
RU8PC866 |
Hinweis: Dies ist die richtige Einstellung für die GUI SQL*Plus-Version (sqlplusW.exe/plus80W.exe/plus33W.exe).
Wenn Sie mit "Sonderzeichen" testen, verwenden Sie die GUI und nicht die "DOS-Box" sqlplus.exe!
Betriebssystem-Gebietsschema | NLS_LANG-Wert |
---|---|
Arabisch (VAE) |
ARABIC_UNITED ARAB EMIRATES.AR8MSWIN1256 |
Bulgarisch |
BULGARIAN_BULGARIA.CL8MSWIN1251 |
Katalanisch |
CATALAN_CATALONIA.WE8MSWIN1252 |
Chinesisch (VR China) |
SIMPLIFIED CHINESE_CHINA.ZHS16GBK |
Chinesisch (Taiwan) |
TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950 |
Chinesisch (Hongkong, HKCS) |
TRADITIONAL CHINESE_HONG KONG.ZHT16HKSCS |
Chinesisch (Hongkong, HKCS2001) |
TRADITIONAL CHINESE_HONG KONG.ZHT16HKSCS2001 (neu in 10gR1) |
Kroatisch |
CROATIAN_CROATIA.EE8MSWIN1250 |
Tschechisch |
CZECH_CZECH REPUBLIC.EE8MSWIN1250 |
Dänisch |
DANISH_DENMARK.WE8MSWIN1252 |
Niederländisch (Niederlande) |
DUTCH_THE NETHERLANDS.WE8MSWIN1252 |
Niederländisch (Belgien) |
DUTCH_BELGIUM.WE8MSWIN1252 |
Englisch (Vereinigtes Königreich) |
ENGLISH_UNITED KINGDOM.WE8MSWIN1252 |
Englisch (USA) |
AMERICAN_AMERICA.WE8MSWIN1252 |
Estnisch |
ESTONIAN_ESTONIA.BLT8MSWIN1257 |
Finnisch |
FINNISH_FINLAND.WE8MSWIN1252 |
Französisch (Kanada) |
CANADIAN FRENCH_CANADA.WE8MSWIN1252 |
Französisch (Frankreich) |
FRENCH_FRANCE.WE8MSWIN1252 |
Deutsch (Deutschland) |
GERMAN_GERMANY.WE8MSWIN1252 |
Griechisch |
GREEK_GREECE.EL8MSWIN1253 |
Hebräisch |
HEBREW_ISRAEL.IW8MSWIN1255 |
Ungarisch |
HUNGARIAN_HUNGARY.EE8MSWIN1250 |
Isländisch |
ICELANDIC_ICELAND.WE8MSWIN1252 |
Indonesisch |
INDONESIAN_INDONESIA.WE8MSWIN1252 |
Italienisch (Italien) |
ITALIAN_ITALY.WE8MSWIN1252 |
Japanisch |
JAPANESE_JAPAN.JA16SJIS |
Koreanisch |
KOREAN_KOREA.KO16MSWIN949 |
Lettisch |
LATVIAN_LATVIA.BLT8MSWIN1257 |
Litauisch |
LITHUANIAN_LITHUANIA.BLT8MSWIN1257 |
Norwegisch |
NORWEGIAN_NORWAY.WE8MSWIN1252 |
Polnisch |
POLISH_POLAND.EE8MSWIN1250 |
Portugiesisch (Brasilien) |
BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252 |
Portugiesisch (Portugal) |
PORTUGUESE_PORTUGAL.WE8MSWIN1252 |
Rumänisch |
ROMANIAN_ROMANIA.EE8MSWIN1250 |
Russisch |
RUSSIAN_CIS.CL8MSWIN1251 |
Slowakisch |
SLOVAK_SLOVAKIA.EE8MSWIN1250 |
Spanisch (Spanien) |
SPANISH_SPAIN.WE8MSWIN1252 |
Schwedisch |
SWEDISH_SWEDEN.WE8MSWIN1252 |
Thailändisch |
THAI_THAILAND.TH8TISASCII |
Spanisch (Mexiko) |
MEXICAN SPANISH_MEXICO.WE8MSWIN1252 |
Spanisch (Venezuela) |
LATIN AMERICAN SPANISH_VENEZUELA.WE8MSWIN1252 |
Türkisch |
TURKISH_TURKEY.TR8MSWIN1254 |
Ukrainisch |
UKRAINIAN_UKRAINE.CL8MSWIN1251 |
Vietnamesisch |
VIETNAMESE_VIETNAM.VN8MSWIN1258 |
Hinweis: Dies ist die richtige Einstellung für die DOS-BOX SQL*Plus-Version (sqlplus.exe/plus80.exe/plus33.exe).
Betriebssystem-Gebietsschema | Oracle Clientzeichensatz (3. Teil von NLS_LANG) |
---|---|
Arabisch |
AR8ASMO8X |
Katalanisch |
WE8PC850 |
Chinesisch (VR China) |
ZHS16GBK |
Chinesisch (Taiwan) |
ZHT16MSWIN950 |
Tschechisch |
EE8PC852 |
Dänisch |
WE8PC850 |
Niederländisch |
WE8PC850 |
Englisch (Vereinigtes Königreich) |
WE8PC850 |
Englisch (USA) |
US8PC437 |
Finnisch |
WE8PC850 |
Französisch |
WE8PC850 |
Deutsch |
WE8PC850 |
Griechisch |
EL8PC737 |
Hebräisch |
IW8PC1507 |
Ungarisch |
EE8PC852 |
Italienisch |
WE8PC850 |
Japanisch |
JA16SJIS |
Koreanisch |
KO16MSWIN949 |
Norwegisch |
WE8PC850 |
Polnisch |
EE8PC852 |
Portugiesisch |
WE8PC850 |
Rumänisch |
EE8PC852 |
Russisch |
RU8PC866 |
Slowakisch |
EE8PC852 |
Slowenisch |
EE8PC852 |
Spanisch |
WE8PC850 |
Schwedisch |
WE8PC850 |
Türkisch |
TR8PC857 |
Was steuert die LANGUAGE-Komponente des NLS_LANG-Parameters?
Die Sprachkomponente des NLS_LANG-Parameters steuert die Verfahren eines Teils der Funktionen zur Unterstützung der Globalisierung. Sie gibt Konventionen an, z. B. die Sprache für Oracle Nachrichten, Sortierung, Tages- und Monatsnamen. Jede unterstützte Sprache hat einen eindeutigen Namen, wie z. B.: AMERICAN, FRENCH oder GERMAN. Das Sprachargument gibt Standardwerte für die Gebiets- und Zeichensatzargumente an. Wenn die Sprache nicht angegeben ist, wird standardmäßig AMERICAN verwendet.
Was steuert die TERRITORY-Komponente des NLS_LANG-Parameters?
Die Gebietskomponente des NLS_LANG-Parameters steuert die Verfahren eines Teils der Funktionen zur Unterstützung der Globalisierung. Sie gibt Konventionen wie das Standardformat für Datum, Geld und Zahlen an. Jedes unterstützte Gebiet hat einen eindeutigen Namen, wie z. B.: AMERICA, FRANCE oder CANADA. Wenn das Gebiet nicht angegeben ist, wird der Wert aus dem Sprachwert abgeleitet.
Verwenden Sie den Befehl dump, um den realen numerischen Wert für ein in der Datenbank gespeichertes Zeichen zu ermitteln:
Die Syntax des Funktionsaufrufs lautet:
DUMP( <value> [, <format> [, <offset> [, <length> ] ] ] )
wobei:
value – ist der anzuzeigende Wert
format – ist eine Zahl, die das Format beschreibt, in dem Bytes des Werts angezeigt werden sollen: 8 – bedeutet oktal, 10 – bedeutet dezimal, 16 – bedeutet hexadezimal; andere Werte zwischen 0 und 16 bedeuten dezimal; Werte über 16 sind etwas verwirrend und bedeuten: Ausgabe als ASCII-Zeichen, wenn sie druckbaren ASCII-Codes entsprechen, Ausgabe als "^x", wenn sie ASCII-Steuercodes entsprechen, andernfalls Ausgabe als hexadezimal; durch das Hinzufügen von 1000 zur Formatnummer werden Zeichensatzinformationen für die Zeichendatentypwerte zum Rückgabewertoffset hinzugefügt. Dies ist der Offset des ersten Bytes des anzuzeigenden Werts. Negative Werte zeigen ausgehend von der Endlänge die Anzahl der anzuzeigenden Bytes an. Zum Beispiel:
SQL> SELECT DUMP(col,1016)FROM table;
Typ=1 Len=39 CharacterSet=UTF8: 227,131,143,227,131,170
Gibt den Wert einer Spalte mit 3 japanischen Zeichen in UTF8-Codierung zurück. Zum Beispiel ist das erste Zeichen 227(*255)+131. Sie müssen dies wahrscheinlich in UCS2 konvertieren, um den Codepunktwert mit der Unicode-Standardcodepage zu überprüfen.
Wo wird die Zeichenkonvertierung durchgeführt?
Normalerweise wird die Konvertierung aus Leistungsgründen auf Clientseite durchgeführt. Dies gilt ab Version 8.0.4. Wenn die Datenbank einen Zeichensatz verwendet, der dem Client nicht bekannt ist, erfolgt die Konvertierung serverseitig. Dies gilt ab Version 8.1.6.
Windows SQL*Plus zeigt nicht alle meine erweiterten Zeichen an?
Wenn Sie schwarze Quadrate anstelle der Zeichen sehen, ist wahrscheinlich nicht die richtige Schriftart für Ihre Codepage definiert. Eine Schriftart ist eine Sammlung von Glyphen (von "Hieroglyphen"), die ein gemeinsames Erscheinungsbild haben (Schriftart, Schriftgröße). Eine Schriftart wird vom Betriebssystem verwendet, um einen numerischen Wert in eine grafische Darstellung auf dem Bildschirm umzuwandeln. Eine Schriftart enthält nicht unbedingt eine grafische Darstellung für alle numerischen Werte, die in der verwendeten Codepage definiert sind. Dies ist der Grund, warum Sie manchmal schwarze Quadrate auf dem Bildschirm sehen, wenn Sie die Schriftarten ändern und die neue Schrift für ein bestimmtes Symbol nicht dargestellt wird.
Mit dem Windows-Dienstprogramm "Zeichentabelle" können Sie feststellen, welche Glyphen zu einer bestimmten Schriftart gehören.
Unter Windows 2000 und XP:
Start –> Ausführen...
Geben Sie "Zeichentabelle" ein, und klicken Sie auf "ok".
Ich erhalte ein Fragezeichen oder ein umgekehrtes Fragezeichen, wenn ich ein gerade eingefügtes Zeichen auswähle?
Wenn Zeichen zwischen dem Client- und dem Datenbankzeichensatz konvertiert werden oder umgekehrt, sollte das Zeichen in beiden vorhanden sein. Wenn es im zu konvertierenden Zeichensatz (dem Ziel) nicht vorhanden ist, wird ein Ersatzzeichen verwendet. Bei einigen Zeichensätzen sind bestimmte Ersetzungszeichen definiert, wenn aus anderen bestimmten Zeichensätzen übersetzt wird. Wenn dies jedoch nicht erfolgt, wird ein Standard-Ersetzungszeichen, wie z. B. ein „?“, verwendet. Die Umwandlung eines Ersatzzeichens in das Originalzeichen ist nicht möglich.
Ist iSQL*Plus der einzige UTF8-/Unicode-fähige Client, den wir unterstützen?
Unter Windows ja und unter Unix-Betriebssystemen nein. Alle Datenbankdienstprogramme, einschließlich Import, Export, SQL*Loader, SQL*Plus, können als UTF-8-Client fungieren, wenn das Gebietsschema des Betriebssystems UTF-8 lautet (z. B. en_US.UTF-8 unter Linux) und der Zeichensatz NLS_LANG auf UTF8 festgelegt ist oder AL32UTF8.
Wie überprüfe ich die von einem UNIX-Betriebssystem verwalteten Codepunkte?
Um zu wissen, welcher Codepunkt für ein Zeichen in einer Unix-Umgebung generiert wird, können Sie den "od"-Befehl verwenden:
$ echo "" | od -xc
Sie können das Zeichen, das einem Codepunkt entspricht, auch mit dem "Echo"-Befehl wie folgt überprüfen:
Für Solaris, AIX, HP-UX, TRU64:
$echo '\0351'
Für Linux:
$echo -e '\0351'
Sie können Locale Builder oder eine gedruckte Codepage (siehe Links unten) verwenden, um zu überprüfen, ob Ihre native Codepage und die NLS_LANG-Einstellung ordnungsgemäß übereinstimmen. Wenn es Unklarheiten gibt, verwenden Sie den obigen Befehl, um die Werte für mehr als ein Zeichen abzurufen. Für gedruckte Codepage:
Normalerweise muss NLS_LANG mit der MS-DOS-OEM-Codepage übereinstimmen, die durch Eingabe von chcp in einer Eingabeaufforderung abgerufen werden kann:
C:\> chcp
Aktive Codepage: 437
C:\> set NLS_LANG=american_america.US8PC437
Für Tools wie SQL*Loader können Sie NLS_LANG vorübergehend in den Zeichensatz der zu ladenden DATEI ändern. Eine Alternative zum Ändern von NLS_LANG besteht darin, den Zeichensatz der Daten in der Datendatei mithilfe des Zeichensatz-Schlüsselworts in der CTL-Datei anzugeben. In diesem Fall interpretiert SQL*Loader die Daten in der Datendatei als diesen Zeichensatz, unabhängig von der Client-Zeichensatzeinstellung von NLS_LANG. Hier ist eine CTL-Beispieldatei für utf16. Dieses Beispiel wird im Demobereich ausgeliefert:
-- Copyright (c) 2001 by Oracle Corporation
-- NAME
-- ulcase11.ctl - Load Data in the Unicode Character Set UTF-16
-- DESCRIPTION
-- Loads data in the Unicode character set UTF-16. The data is in little
-- Endean byte order. This means that depending on whether SQL*Loader is
-- running on a little Endean or a big Endean system, it will have to
-- byte swap the UTF-16 character data as necessary. This load uses
-- character length semantics, the default for the character set UTF-16.
--
-- This case study is modeled after case study 3 (ulcase3), which loads
-- variable length delimited (terminated and enclosed) data.
--
-- RETURNS
--
-- NOTES
-- None
-- MODIFIED (MM/DD/YY)
-- rpfau 02/06/01 - Merged rpfau_sqlldr_add_case_study_11
-- rpfau 01/30/01 - Creation
--
LOAD DATA
CHARACTERSET utf16
BYTEORDER little
INFILE ulcase11.dat
REPLACE
INTO TABLE EMP
FIELDS TERMINATED BY X'002c' OPTIONALLY ENCLOSED BY X'0022'
(empno integer external (5), ename, job, mgr,
hiredate DATE(20) "DD-Month-YYYY",
sal, comm,
deptno CHAR(5) TERMINATED BY ":",
projno,
loadseq SEQUENCE(MAX,1) )
In Oracle9i exportiert das Export-Dienstprogramm immer Benutzerdaten, einschließlich Unicode-Daten, in den Zeichensatz der Datenbank. Das Import-Dienstprogramm konvertiert die Daten automatisch in den Zeichensatz der Zieldatenbank.
In Oracle8i exportiert das Export-Dienstprogramm Benutzerdaten, um sie aus dem Datenbankzeichensatz in den Zeichensatz der NLS_LANG der Exportsitzung zu konvertieren. Das Import-Dienstprogramm konvertiert die Daten zuerst in den Zeichensatz der NLS_LANG der Importsitzung und konvertiert sie dann in den Zeichensatz der Zieldatenbank. Es muss darauf geachtet werden, dass der Zeichensatz der NLS_LANG für Export- und Importsitzungen alle zu migrierenden Zeichen enthält. Dieser Zeichensatz wird normalerweise als Quellendatenbank- oder Zieldatenbankzeichensatz ausgewählt und ist in der Regel für Export- und Importsitzungen identisch. Diese Auswahl wird insbesondere für Multibyte-Zeichensätze empfohlen, für die einige Einschränkungen für Exportdateien gelten. Die Oracle8i-Konvertierungen in und aus dem NLS_LANG-Zeichensatz erfolgen in Oracle9i für DDL-Anweisungen, die in der Exportdatei enthalten sind.
Die NLS_LANG auf dem Server (oder Client) hat keinen Einfluss auf die Zeichensatzkonvertierung über eine Datenbankverbindung. Oracle konvertiert den Zeichensatz der Quellendatenbank in den Zeichensatz der Zieldatenbank (oder umgekehrt).
Es gibt mit NLS_LANG und den Multiple Homes unter Windows keine Besonderheiten zu beachten. Der berücksichtigte Parameter ist der im Registry-Schlüssel ORACLE_HOME angegebene Parameter, der von der ausführbaren Datei verwendet wird. Wenn NLS_LANG in der Umgebung festgelegt ist, hat dies Vorrang vor dem Wert in der Registry und wird für ALLE Oracle_Homes auf dem Server/Client verwendet.
Die NLS_LANG kann in diesen Registry-Schlüsseln gefunden werden:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
oder
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEx
Unter Windows gibt es zwei Arten von Tools/Anwendungen:
Der einzige Unicode-fähige Client, der in der Oracle Database enthalten ist, ist iSQL*Plus.
Ein Zeichensatz ist nur eine Vereinbarung darüber, welchen numerischen Wert ein Symbol hat. Ein Computer weiß nicht, ob es sich um ‘A’ oder ‘B ' handelt, sondern kennt nur den (binären) numerischen Wert für dieses Symbol, der im Zeichensatz des Betriebssystems (OS) oder in der Hardware (Firmware) für Terminals definiert ist. Ein Computer kann nur Zahlen manipulieren, weshalb Zeichensätze erforderlich sind. Beispiele dafür sind 'ASCII', ein alter 7-Bit-Zeichensatz, 'ROMAN8', ein 8-Bit-Zeichensatz unter UNIX, oder 'UTF8', ein Multibyte-Zeichensatz.
Eine Codepage ist der Name für das Windows-/DOS-Codierungsschema. Für Oracle NLS können Sie sie als Zeichensatz betrachten. Sie müssen auch zwischen einem FONT und einem Zeichensatz/einer Codepage unterscheiden. Das Betriebssystem verwendet eine Schriftart, um einen numerischen Wert in einen grafischen Wert umzuwandeln, der auf dem Bildschirm 'ausgedruckt' wird. Die Schriftart „Wingdings“ unter Windows ist das beste Beispiel für eine Schriftart, bei der ein ‘A’ NICHT als ‘A’ auf dem Bildschirm angezeigt wird, jedoch steht der numerische Wert für das Betriebssystem für ein ‘A’. Sie SEHEN es nicht als ‘A’, aber für Windows ist es ein ‘A’ und wird als ‘A’ gespeichert (oder verwendet).
Um die obige Erklärung besser zu verstehen, öffnen Sie einfach MS Word, wählen Sie die Schriftart „Wingdings“, geben Sie Ihren Namen ein (es werden Symbole angezeigt) und speichern Sie diese Datei als HTML. Wenn Sie die HTML-Datei mit Notepad öffnen, sehen Sie im Abschnitt <style>, dass die Schriftarten deklariert sind, und weiter unten im Abschnitt <body> finden Sie den Namen im Klartext, jedoch mit dem Attribut style='font-family: Wingdings’. Wenn Sie es in Internet Explorer oder Netscape öffnen, sehen Sie wieder die Wingdings-Symbole. Es ändert sich nur die Präsentation, nicht die Daten an sich.
Es ist auch möglich, dass die Symbole, die in der verwendeten Codepage definiert sind, nicht in einer bestimmten Schriftart angezeigt werden, da der Ersteller der Schriftart keine grafische Darstellung für alle Symbole in dieser Schriftart erstellt hat. Deshalb werden manchmal schwarze Quadrate auf dem Bildschirm angezeigt, wenn Sie die Schriftarten ändern. Unter Windows können Sie das Dienstprogramm 'Zeichentabelle' verwenden, um alle in einer Schriftart definierten Symbole anzuzeigen.
Zwei Hauptgründe:
Traditionell definierten Anbieter unterschiedliche 'Zeichensätze' für Hardware und Software, vor allem, weil es keine offiziellen Standards gab.
Neue Zeichensätze wurden definiert, um neue Sprachen zu unterstützen. Bei einem 8-Bit-Zeichensatz ist die Anzahl der unterstützten Symbole begrenzt, sodass für verschiedene geschriebene Sprachen unterschiedliche Zeichensätze verfügbar sind.
Ein 7-Bit-Zeichensatz kennt nur 128 Symbole (2^7)
Ein 8-Bit-Zeichensatz kennt 256 Symbole (2^8)
Unicode (UTF-8) ist ein Multibyte-Zeichensatz. Unicode kann über eine Million Zeichen definieren. Weitere Informationen zu Unicode finden Sie im Whitepaper Oracle Unicode Database Support (PDF)
Eine grundlegende Überlegung bei der Auswahl eines Zeichensatzes besteht darin, sicherzustellen, dass er mit jeder Sprache umgehen kann, die sofort und auf unbestimmte Zeit unterstützt werden muss. Eine weitere Überlegung, die übersehen wird, besteht darin, darüber nachzudenken, welche Anwendungen und Technologien Sie möglicherweise verwenden oder mit der Datenbank interagieren lassen möchten. Verwenden Sie den Locale Builder (ab Oracle Database 9i), um anzuzeigen, welche Zeichen für einen bestimmten Oracle Zeichensatz definiert sind.
Durch die Auswahl von Unicode als Datenbankzeichensatz wird eine solide Grundlage für alle in der Datenbank enthaltenen und darauf basierenden Elemente sichergestellt. Oracle empfiehlt die Verwendung von Unicode für alle neuen Systembereitstellungen. Es wird auch empfohlen, ältere Systeme nach Unicode zu migrieren. Die Bereitstellung Ihrer Systeme in Unicode bietet viele Vorteile in Bezug auf Benutzerfreundlichkeit, Kompatibilität und Erweiterbarkeit. Dank des umfassenden Supports von Oracle können Sie leistungsstarke Systeme schneller und einfacher bereitstellen und dabei die gesamte Leistungsfähigkeit von Unicode nutzen. Auch wenn Sie jetzt keine mehrsprachigen Daten unterstützen müssen oder Unicode benötigen. Auf lange Sicht ist dies wahrscheinlich die beste Wahl für ein neues System. Dies spart Ihnen letztendlich Zeit und Geld und verschafft Ihnen Wettbewerbsvorteile.