Oracle-set, Standard-NLS_LANG
Ich bin mit Oracle database 11g auf RHEL6. Wenn kein client NLS_LANG einstellen der Länge von einigen utf8-Zeichen ist 2. Nach NLS_LANG=AMERICAN_AMERICA.UTF8 ist festgelegt, die Länge ist nur 1.
Wie kann der Einsatz der Standard-NLG_LANG geändert für die ganze Datenbank? Ich will nicht zu ändern Sie diesen Wert nur für eine session, oder wie enviromental variable in linux. Gibt es irgendeine Möglichkeit, um es allgemein für die Datenbank?
SQL> select length('á') from dual;
LENGTH('??')
------------
2
# export NLS_LANG=AMERICAN_AMERICA.UTF8
SQL> select length('á') from dual;
LENGTH('á')
-----------
1
Vielen Dank für jede Idee
InformationsquelleAutor etharendil | 2012-03-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, was wahrscheinlich passiert:
á
nimmt zwei bytes, damit Ihre Kunden senden, die diese zwei bytes, während das erzählen von Oracle zu behandeln diese als CP1252. In CP1252 zwei Byte-code für die zwei Zeichen, die in der DB die Interpretation der Eingabe als zwei Zeichen enthalten, daherlength('à')
gleich 2 ist (und wenn Sie fügen Sie diese Zeichenfolge, die das Ergebnis des Einsatzes ist nicht gleichà
)Fazit: stellen Sie Ihre client-Zeichensatz richtig eingestellt, oder Sie bekommen übersetzungsfehler (bekommen Sie keine ungültigen Zeichen dieser Art, aber vielleicht hast du seltsame Symbole (
¿
).Den Datenbank-Zeichensatz festgelegt ist, zum Zeitpunkt der Erstellung und ist in der Regel geändert, über " exportieren/erstellen einer leeren Datenbank/importieren.
Jeder Kunde hat ein Zeichen gesetzt, dass muss richtig eingestellt sein, so dass die Datenbank weiß, wie man mit dem Kunden kommunizieren. In windows wird dieser Zeichensatz wird in der Regel in der registry definiert, in linux eine Umgebungsvariable. Ich weiß nicht, über perl, aber es ist etwas, dass alle clients müssen an die Datenbank, damit die Dokumentation sollte nicht schwer zu finden.
Gibt es eine Möglichkeit zu zwingen, NSL_LANG ? Ich versuchte es mit, bevor die Datenbank auslösen und den Befehl HOST-export NLS_LANG=NLS_LANG=AMERICAN_AMERICA.UTF8, aber das funktioniert nicht.
Dies ist ein client Einstellungen sind, ist es der Verantwortung des client legen Sie es richtig, weil nur der Kunde weiß, welchen Zeichensatz er verwendet. Sie können nicht aus der Datenbank mit einem trigger. Übrigens
HOST ...
ist nicht auf einem Oracle-Befehl, sondern ein SQLPlus-Befehl, SQLPlus als client 🙂InformationsquelleAutor Vincent Malgrat
Da der Datenbank-Zeichensatz AL32UTF8, wenn Sie die client -
NLS_LANG
auf UTF8, sagen Sie Oracle zu umgehen, um den Zeichensatz-Konvertierung, die normalerweise stattfindet, wenn Daten übertragen werden zwischen dem client und dem server. Das ist extrem gefährlich, weil es bedeutet, dass, wenn der client sendet die Daten in irgendeiner anderen Kodierung, besteht eine erhebliche Gefahr, dass ungültige Daten in der Datenbank gespeichert werden. In diesem Fall, dieLENGTH
nennen, die 1 zurückgibt, sendet falsch kodierten Daten in der Datenbank. Wahrscheinlich, das client-Betriebssystem stellt Daten mit so etwas wie ISO-8859-1-Zeichensatz, wo á ist ein single-byte-Zeichen (Binär-Wert 0xE1). Wenn der client sendet die Daten an die Datenbank sendet die 0xE1 und erzählt die Datenbank "Vertrauen Sie mir, dies ist gültige UTF-8-Daten". Die Datenbank wird sich nicht die Mühe zu überprüfen, werden die binären Daten, um zu bemerken, dass 0xE1 ist keine gültige binäre Darstellung eines Zeichens in UTF-8-Zeichensatz. Aber nun, wenn einige andere Kunden kommt, ist richtig konfiguriert und bittet für character set translation stattfindet, und die Datenbank hat eine 0xE1 gespeichert in einige Spalte, die " character set conversion code ausgeführt wird, identifizieren, 0xE1 ist keine gültige UTF-8-Zeichen, und geben Sie einen Ersatz-Charakter (allgemein '?') statt á, um die korrekt konfigurierten client.Da der Datenbank-Zeichensatz ist UTF-8, Sie würden erwarten, dass ein 'á' Charakter würde die Länge 2 haben. UTF-8 ist ein variable-width-Zeichen gesetzt. Zeichen, die Teil der Zeichensatz US7ASCII sind durch 1 byte dargestellt, die meisten westeuropäischen Zeichen wie das 'á' dargestellt werden mit 2 bytes, und die meisten asiatischen Zeichen dargestellt werden, unter Verwendung von 3 bytes. Es gibt ein paar seltene Zeichen, die benötigen 4 bytes.
Ihre
NLS_LANG
muss so eingestellt werden, entsprechen den Zeichensatz, den Ihr client-system unterstützt. Es ist selten, dass man einen client-system, das native UTF-8-Unterstützung. Seit Ihrer client-Einstellung überschreiben, etwas an der Datenbank-Ebene, was bedeutet, dass jeder client muss konfiguriert werden, um eine entsprechende Umgebungsvariable. Es ist ein Abschnitt in derNLS_LANG FAQ
auf wie ermitteln Sie die korrekteNLS_LANG
- Einstellung für einen Unix-client.Aktualisiert meine Antwort.
InformationsquelleAutor Justin Cave