In generale tutti i tuoi punti sono corretti. NLS_NCHAR_CHARACTERSET
definisce il set di caratteri per NVARCHAR2
, et. al. colonne mentre NLS_CHARACTERSET
è usato per VARCHAR2
.
Perché è possibile che vengano visualizzati caratteri cinesi con US7ASCII
?
Il motivo è che il set di caratteri del database e il set di caratteri del client (ad esempio, vedere NLS_LANG
value) sono entrambi US7ASCII
. Il tuo database utilizza US7ASCII
e "pensa" anche che il client invii i dati utilizzando US7ASCII
. Pertanto non effettua alcuna conversione delle stringhe, i dati vengono trasferiti bit per bit da client a server e viceversa.
Per questo motivo puoi usare caratteri che in realtà non sono supportati da US7ASCII
. Tieni presente che nel caso in cui il tuo client utilizzi un set di caratteri diverso (ad esempio quando usi il driver gestito ODP.NET in un'applicazione Windows) i dati saranno spazzatura! Inoltre, se consideri una migrazione del set di caratteri del database, hai lo stesso problema.
Un'altra nota:non penso che avresti lo stesso comportamento con altri set di caratteri, ad es. se il tuo database e il tuo client usano entrambi WE8ISO8859P1
Per esempio. Tieni anche presente che in realtà hai una configurazione errata. Il tuo database utilizza il set di caratteri US7ASCII
, il tuo NLS_LANG
il valore è anche US7ASCII
(molto probabilmente non è impostato affatto e Oracle lo imposta per impostazione predefinita su US7ASCII
) ma il vero set di caratteri di SQL*Plus, risp. il tuo cmd.exe
il terminale è molto probabilmente CP950 o CP936.
Se desideri impostare tutto correttamente, puoi impostare la tua variabile di ambiente NLS_LANG=.ZHT16MSWIN950
(CP936 sembra non essere supportato da Oracle) o cambia la codepage prima di eseguire sqlplus.exe
con il comando chcp 437
. Con queste impostazioni corrette non vedrai alcun carattere cinese come probabilmente ti saresti aspettato.