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ł.