Im Allgemeinen sind alle Ihre Punkte richtig. NLS_NCHAR_CHARACTERSET
definiert den Zeichensatz für NVARCHAR2
, usw. Al. Spalten, während NLS_CHARACTERSET
wird für VARCHAR2
verwendet .
Warum ist es möglich, dass Sie chinesische Schriftzeichen mit US7ASCII
sehen ?
Der Grund dafür ist Ihr Datenbank-Zeichensatz und Ihr Client-Zeichensatz (d.h. siehe NLS_LANG
Wert) sind beide US7ASCII
. Ihre Datenbank verwendet US7ASCII
und es "denkt" auch, dass der Client Daten mit US7ASCII
sendet . Es findet also keine Konvertierung der Strings statt, die Daten werden bitweise vom Client zum Server und umgekehrt übertragen.
Dadurch können Sie Zeichen verwenden, die von US7ASCII
eigentlich nicht unterstützt werden . Seien Sie sich bewusst, falls Ihr Client einen anderen Zeichensatz verwendet (z. B. wenn Sie ODP.NET Managed Driver in einer Windows-Anwendung verwenden), werden die Daten Müll sein! Auch wenn Sie eine Migration des Datenbankzeichensatzes in Betracht ziehen, haben Sie das gleiche Problem.
Noch eine Anmerkung:Ich glaube nicht, dass Sie das gleiche Verhalten mit anderen Zeichensätzen bekommen würden, z. wenn sowohl Ihre Datenbank als auch Ihr Client WE8ISO8859P1
verwenden würden zum Beispiel. Beachten Sie auch, dass Sie tatsächlich eine falsche Konfiguration haben. Ihre Datenbank verwendet den Zeichensatz US7ASCII
, Ihr NLS_LANG
Wert ist auch US7ASCII
(höchstwahrscheinlich ist es überhaupt nicht gesetzt und Oracle verwendet standardmäßig US7ASCII
), sondern der echte Zeichensatz von SQL*Plus, bzw. Ihre cmd.exe
Terminal ist höchstwahrscheinlich CP950 oder CP936.
Wenn Sie alles richtig einstellen möchten, können Sie entweder Ihre Umgebungsvariable NLS_LANG=.ZHT16MSWIN950
setzen (CP936 scheint von Oracle nicht unterstützt zu werden) oder ändern Sie Ihre Codepage, bevor Sie sqlplus.exe
ausführen mit dem Befehl chcp 437
. Mit diesen richtigen Einstellungen werden Sie keine chinesischen Schriftzeichen sehen, wie Sie es wahrscheinlich erwartet hätten.