Oracle
 sql >> Database >  >> RDS >> Oracle

differenza tra NLS_NCHAR_CHARACTERSET e NLS_CHARACTERSET per Oracle

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.