Ogólnie wszystkie twoje punkty są poprawne. NLS_NCHAR_CHARACTERSET definiuje zestaw znaków dla NVARCHAR2 , i in. glin. kolumny natomiast NLS_CHARACTERSET jest używany dla VARCHAR2 .
Dlaczego możliwe jest, że widzisz chińskie znaki z US7ASCII? ?
Powodem jest zestaw znaków bazy danych i zestaw znaków klienta (np. zobacz NLS_LANG wartość) to oba US7ASCII . Twoja baza danych używa US7ASCII i "myśli", że klient wysyła dane za pomocą US7ASCII . Dzięki temu nie dokonuje żadnej konwersji ciągów, dane są przesyłane bit po bicie od klienta do serwera i odwrotnie.
Dzięki temu możesz używać znaków, które w rzeczywistości nie są obsługiwane przez US7ASCII . Pamiętaj, że w przypadku, gdy twój klient używa innego zestawu znaków (np. gdy używasz zarządzanego sterownika ODP.NET w aplikacji Windows), dane będą śmieciami! Również jeśli rozważysz migrację zestawu znaków bazy danych, masz ten sam problem.
Kolejna uwaga:nie sądzę, że zachowałbyś to samo z innymi zestawami znaków, np. jeśli twoja baza danych i twój klient używaliby WE8ISO8859P1 na przykład. Należy również pamiętać, że faktycznie masz niewłaściwą konfigurację. Twoja baza danych używa zestawu znaków US7ASCII , Twój NLS_LANG wartość to także US7ASCII (najprawdopodobniej w ogóle nie jest ustawiony, a Oracle domyślnie ustawia go na US7ASCII ), ale prawdziwy zestaw znaków SQL*Plus, odp. Twój cmd.exe terminal to najprawdopodobniej CP950 lub CP936.
Jeśli chcesz ustawić wszystko poprawnie, możesz ustawić zmienną środowiskową NLS_LANG=.ZHT16MSWIN950 (CP936 wydaje się nie być obsługiwany przez Oracle) lub zmień stronę kodową przed uruchomieniem sqlplus.exe poleceniem chcp 437 . Przy tych prawidłowych ustawieniach nie zobaczysz żadnych chińskich znaków, jak prawdopodobnie byś się spodziewał.