Generelt er alle dine pointer korrekte. NLS_NCHAR_CHARACTERSET
definerer tegnsættet for NVARCHAR2
, et. al. kolonner, hvorimod NLS_CHARACTERSET
bruges til VARCHAR2
.
Hvorfor er det muligt, at du ser kinesiske tegn med US7ASCII
?
Årsagen er, dit databasetegnsæt og dit klienttegnsæt (dvs. se NLS_LANG
værdi) er begge US7ASCII
. Din database bruger US7ASCII
og den "tror" også at klienten sender data ved hjælp af US7ASCII
. Den foretager således ingen konvertering af strengene, dataene overføres bit-for-bit fra klient til server og omvendt.
Derfor kan du bruge tegn, som faktisk ikke understøttes af US7ASCII
. Vær opmærksom på, at hvis din klient bruger et andet tegnsæt (f.eks. når du bruger ODP.NET Managed Driver i en Windows-applikation), vil dataene være vrøvl! Også hvis du overvejer migrering af et databasetegnsæt, har du det samme problem.
En anden note:Jeg tror ikke, du ville få den samme adfærd med andre tegnsæt, f.eks. hvis din database og din klient begge ville bruge WE8ISO8859P1
for eksempel. Vær også opmærksom på, at du faktisk har forkert konfiguration. Din database bruger tegnsæt US7ASCII
, din NLS_LANG
værdien er også US7ASCII
(mest sandsynligt er det slet ikke indstillet, og Oracle indstiller det som standard til US7ASCII
), men det rigtige tegnsæt af SQL*Plus, hhv. din cmd.exe
terminal er højst sandsynligt CP950 eller CP936.
Hvis du kan lide at indstille alt korrekt, kan du enten indstille din miljøvariabel NLS_LANG=.ZHT16MSWIN950
(CP936 synes ikke at være understøttet af Oracle), eller skift din tegntabel, før du kører sqlplus.exe
med kommandoen chcp 437
. Med disse korrekte indstillinger vil du ikke se nogen kinesiske tegn, som du sandsynligvis ville have forventet.