Over het algemeen zijn al je punten correct. NLS_NCHAR_CHARACTERSET
definieert de tekenset voor NVARCHAR2
, enz. al. kolommen terwijl NLS_CHARACTERSET
wordt gebruikt voor VARCHAR2
.
Waarom is het mogelijk dat u Chinese karakters ziet met US7ASCII
?
De reden hiervoor is uw database-tekenset en uw client-tekenset (d.w.z. zie NLS_LANG
waarde) zijn beide US7ASCII
. Uw database gebruikt US7ASCII
en het "denkt" dat de client ook gegevens verzendt met behulp van US7ASCII
. Het maakt dus geen conversie van de strings, de gegevens worden bit-voor-bit overgedragen van client naar server en vice versa.
Daarom kunt u tekens gebruiken die eigenlijk niet worden ondersteund door US7ASCII
. Houd er rekening mee dat als uw client een andere tekenset gebruikt (bijvoorbeeld wanneer u ODP.NET Managed Driver in een Windows-toepassing gebruikt), de gegevens onzin zijn! Ook als u een migratie van databasetekensets zou overwegen, heeft u hetzelfde probleem.
Nog een opmerking:ik denk niet dat je hetzelfde gedrag zou krijgen met andere tekensets, b.v. als uw database en uw klant beide WE8ISO8859P1
. zouden gebruiken bijvoorbeeld. Houd er ook rekening mee dat je eigenlijk een verkeerde configuratie hebt. Uw database gebruikt tekenset US7ASCII
, uw NLS_LANG
waarde is ook US7ASCII
(hoogstwaarschijnlijk is het helemaal niet ingesteld en zet Oracle het standaard op US7ASCII
) maar de echte tekenset van SQL*Plus, resp. uw cmd.exe
terminal is hoogstwaarschijnlijk CP950 of CP936.
Als je alles goed wilt instellen, kun je ofwel je omgevingsvariabele NLS_LANG=.ZHT16MSWIN950
instellen (CP936 lijkt niet te worden ondersteund door Oracle) of wijzig uw codepagina voordat u sqlplus.exe
uitvoert met commando chcp 437
. Met deze juiste instellingen zul je geen Chinese karakters zien zoals je waarschijnlijk had verwacht.