Като цяло всички ваши точки са верни. NLS_NCHAR_CHARACTERSET
дефинира набора от знаци за NVARCHAR2
, et. ал. колони, докато NLS_CHARACTERSET
се използва за VARCHAR2
.
Защо е възможно да виждате китайски знаци с
US7ASCII
?
Причината е, че вашият набор от знаци в базата данни и вашия клиентски набор от знаци (т.е. вижте NLS_LANG
стойност) и двете са US7ASCII
. Вашата база данни използва US7ASCII
и "мисли" също, че клиентът изпраща данни, използвайки US7ASCII
. По този начин не прави никакво преобразуване на низовете, данните се прехвърлят бит по бит от клиент към сървър и обратно.
Поради този факт можете да използвате знаци, които всъщност не се поддържат от US7ASCII
. Имайте предвид, че в случай, че вашият клиент използва различен набор от знаци (например, когато използвате ODP.NET Managed Driver в приложение за Windows), данните ще бъдат боклуци! Също така, ако обмислите миграция на набор от знаци в базата данни, имате същия проблем.
Друга забележка:не мисля, че бихте получили същото поведение с други набори от знаци, напр. ако и вашата база данни, и вашият клиент биха използвали WE8ISO8859P1
например. Също така имайте предвид, че всъщност имате грешна конфигурация. Вашата база данни използва набор от знаци US7ASCII
, вашият NLS_LANG
стойността също е US7ASCII
(най-вероятно той изобщо не е зададен и Oracle го задава по подразбиране на US7ASCII
), но истинският набор от знаци на SQL*Plus, респ. вашият cmd.exe
терминалът най-вероятно е CP950 или CP936.
Ако искате да настроите всичко правилно, можете или да зададете променливата на средата NLS_LANG=.ZHT16MSWIN950
(CP936 изглежда не се поддържа от Oracle) или променете кодовата си страница, преди да стартирате sqlplus.exe
с команда chcp 437
. С тези правилни настройки няма да видите никакви китайски знаци, както вероятно бихте очаквали.