I allmänhet är alla dina poäng korrekta. NLS_NCHAR_CHARACTERSET
definierar teckenuppsättningen för NVARCHAR2
, et. al. kolumner medan NLS_CHARACTERSET
används för VARCHAR2
.
Varför är det möjligt att du ser kinesiska tecken med
US7ASCII
?
Anledningen är din databasteckenuppsättning och din klientteckenuppsättning (dvs. se NLS_LANG
värde) är båda US7ASCII
. Din databas använder US7ASCII
och den "tror" att klienten också skickar data med US7ASCII
. Den gör alltså ingen konvertering av strängarna, data överförs bit för bit från klient till server och vice versa.
På grund av detta kan du använda tecken som faktiskt inte stöds av US7ASCII
. Var medveten om, om din klient använder en annan teckenuppsättning (t.ex. när du använder ODP.NET Managed Driver i en Windows-applikation) kommer data att vara skräp! Om du skulle överväga en migrering av databasteckenuppsättning har du samma problem.
En annan notering:Jag tror inte att du skulle få samma beteende med andra teckenuppsättningar, t.ex. om din databas och din klient båda skulle använda WE8ISO8859P1
till exempel. Tänk också på att du faktiskt har fel konfiguration. Din databas använder teckenuppsättningen US7ASCII
, din NLS_LANG
värdet är också US7ASCII
(mest troligt är den inte inställd alls och Oracle använder den som standard till US7ASCII
) men den verkliga teckenuppsättningen av SQL*Plus, resp. din cmd.exe
terminalen är troligen CP950 eller CP936.
Om du vill ställa in allt korrekt kan du antingen ställa in din miljövariabel NLS_LANG=.ZHT16MSWIN950
(CP936 verkar inte stöds av Oracle) eller ändra din teckentabell innan du kör sqlplus.exe
med kommandot chcp 437
. Med dessa korrekta inställningar kommer du inte att se några kinesiska tecken som du förmodligen hade förväntat dig.