web-dev-qa-db-fra.com

différence entre NLS_NCHAR_CHARACTERSET et NLS_CHARACTERSET pour Oracle

j'ai une question rapide ici, que je voudrais savoir la différence entre le réglage NLS_NCHAR_CHARACTERSET et NLS_CHARACTERSET dans Oracle ??

d'après ma compréhension, NLS_NCHAR_CHARACTERSET est pour les types de données NVARCHAR et pour NLS_CHARACTERSET serait pour les types de données VARCHAR2.

j'ai essayé de tester cela sur mon serveur de développement dont les paramètres actuels pour CHARACTERSET sont les suivants: -

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               US7ASCII

J'ai ensuite inséré des valeurs de caractères chinois dans la base de données. j'ai inséré les caractères dans une table appelée data_ et mis à jour la colonne pour ADDRESS et ADDRESS_2 qui sont des colonnes VARCHAR2. De par ma compréhension du paramètre actuel de NLS_CHARACTERSET US7ASCII, les caractères chinois ne devraient pas être pris en charge, mais il est toujours affiché dans la base de données ?? NLS_NCHAR_CHARACTERSET a-t-il priorité sur cela ??

Merci.

9

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 value) sont les deux US7ASCII. Votre base de données utilise US7ASCII et il "pense" également 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 vers le serveur et vice versa.

De ce fait, vous pouvez utiliser des caractères qui ne sont pas pris en charge par US7ASCII. Soyez conscient, au cas où votre client utilise un jeu de caractères différent (par exemple lorsque vous utilisez ODP.NET Managed Driver dans une application Windows), les données seront des ordures! De plus, si vous envisagez une migration de jeu de caractères de base de données, vous rencontrez le même problème.

Une 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 utilisent tous deux WE8ISO8859P1 par exemple. Sachez également que votre configuration est incorrecte. 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 vrai jeu de caractères de SQL * Plus, resp. votre cmd.exe terminal est très probablement CP95 ou CP936 .

Si vous souhaitez tout configurer correctement, vous pouvez définir votre variable d'environnement NLS_LANG=.ZHT16MSWIN950 (CP936 ne semble pas être pris en charge par Oracle) ou modifiez votre page de code 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 vous y attendiez probablement.

7