sql >> Database >  >> RDS >> Oracle

verschil tussen NLS_NCHAR_CHARACTERSET en NLS_CHARACTERSET voor Oracle

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.




  1. SQLite - ORDER OP RAND()

  2. Hoe CHAR_LENGTH() werkt in MariaDB

  3. Getallen opmaken als valuta in PostgreSQL

  4. PDO vs pg_* functies