Oracle
 sql >> Base de données >  >> RDS >> Oracle

différence entre NLS_NCHAR_CHARACTERSET et NLS_CHARACTERSET pour Oracle

En général, tous vos points sont corrects. NLS_NCHAR_CHARACTERSET définit le jeu de caractères pour NVARCHAR2 , et. Al. colonnes alors que NLS_CHARACTERSET est utilisé pour VARCHAR2 .

Pourquoi est-il possible que vous voyiez des caractères chinois avec US7ASCII ?

La raison en est que votre jeu de caractères de base de données et votre jeu de caractères client (c'est-à-dire voir NLS_LANG valeur) sont tous deux US7ASCII . Votre base de données utilise US7ASCII et il "pense" aussi que le client envoie des données en utilisant US7ASCII . Ainsi, il ne fait aucune conversion des chaînes, les données sont transférées bit par bit du client au serveur et vice versa.

De ce fait, vous pouvez utiliser des caractères qui ne sont actuellement pas pris en charge par US7ASCII . Sachez que si votre client utilise un jeu de caractères différent (par exemple, lorsque vous utilisez le pilote géré ODP.NET dans une application Windows), les données seront nulles ! De même, si vous envisagez une migration du jeu de caractères de la base de données, vous rencontrez le même problème.

Autre remarque :je ne pense pas que vous obtiendriez le même comportement avec d'autres jeux de caractères, par ex. si votre base de données et votre client utiliseraient tous les deux WE8ISO8859P1 par exemple. Sachez également que vous avez en fait une mauvaise configuration. Votre base de données utilise le jeu de caractères US7ASCII , votre NLS_LANG la valeur est également US7ASCII (très probablement, il n'est pas défini du tout et Oracle le définit par défaut sur US7ASCII ) mais le jeu de caractères réel de SQL*Plus, resp. votre cmd.exe terminal est très probablement CP950 ou CP936.

Si vous souhaitez tout définir correctement, vous pouvez soit définir votre variable d'environnement NLS_LANG=.ZHT16MSWIN950 (CP936 semble ne pas être pris en charge par Oracle) ou modifiez votre page de codes avant d'exécuter sqlplus.exe avec la commande chcp 437 . Avec ces paramètres appropriés, vous ne verrez aucun caractère chinois comme vous l'auriez probablement prévu.