Différence entre VARCHAR2 (10 CHAR) et NVARCHAR2(10)

J'ai installé Oracle Database 10g Express Edition (Universal) avec les paramètres par défaut:

SELECT * FROM NLS_DATABASE_PARAMETERS;

NLS_CHARACTERSET               AL32UTF8                                 
NLS_NCHAR_CHARACTERSET         AL16UTF16                                

étant donné que les types de données CHAR et NCHAR semblent accepter des chaînes à plusieurs octets, Quelle est la différence exacte entre ces deux définitions de colonnes?

VARCHAR2(10 CHAR)
NVARCHAR2(10)
44
demandé sur Álvaro González 2010-12-22 13:44:35

3 réponses

le type de données NVARCHAR2 a été introduit par Oracle pour les bases de données qui veulent utiliser Unicode pour certaines colonnes tout en gardant un autre jeu de caractères pour le reste de la base de données (qui utilise VARCHAR2). Le NVARCHAR2 est un type de données Unicode seulement.

une raison que vous pouvez vouloir utiliser NVARCHAR2 pourrait être que votre DB utilise un jeu de caractères non Unicode et vous voulez toujours être en mesure de stocker des données Unicode pour certaines colonnes sans changer le primaire jeu de caractères. Une autre raison pourrait être que vous voulez utiliser deux jeux de caractères Unicode (AL32UTF8 pour les données provenant principalement d'Europe occidentale, AL16UTF16 pour les données provenant principalement D'Asie Par exemple) parce que des jeux de caractères différents ne stockeront pas les mêmes données aussi efficacement.

les deux colonnes de votre exemple (Unicode VARCHAR2(10 CHAR) et NVARCHAR2(10) ) seraient capables de stocker les mêmes données, cependant le stockage byte sera différent. Certaines chaînes peuvent être stockées plus efficacement dans l'un ou l'autre.

Notez aussi que certaines fonctionnalités ne fonctionneront pas avec NVARCHAR2, voir cette question SO:

76
répondu Vincent Malgrat 2017-05-23 12:10:10

nVarchar2 est une Unicode seulement de stockage.

bien que les deux types de données soient des types de données à chaîne de longueur variable, vous pouvez remarquer la différence dans la façon dont ils stockent les valeurs. Chaque caractère est stocké en octets. Comme nous le savons, toutes les langues n'ont pas des alphabets de même longueur, par exemple, l'alphabet anglais a besoin d'un octet par caractère, cependant, les langues comme le japonais ou le Chinois ont besoin de plus d'un octet pour stocker un caractère.

quand vous spécifiez varchar2(10) , vous dites au DB que seulement 10 octets de données seront stockées. Mais, quand vous dites nVarchar2 (10) , cela signifie 10 caractères sera stocké. Dans ce cas, vous n'avez pas à vous soucier du nombre d'octets de chaque personnage.

0
répondu Pooja 2017-12-02 18:57:22

je me demande si NVARCHAR2(1) et VARCHAR2(1) agissent différemment en ce qui concerne la valeur nulle / vide?

des tests, semble identique ..

peut obtenir quelques surprises

c'est à dire la comparaison de chaîne de caractères vide != 'Y' ne renvoie pas les lignes vides .. c'est-à-dire que la chaîne vide n'est pas égale à "Y"...

besoin nvl fonction wrapper

par exemple et nvl (supérieur (WP."OW_IS_MISRUN"),' N')!= 'Y'

sélectionner compter(*) de "DATA_HUB"."OW_WELL_PERFORATION" WP où WP.UWI = 17038046

7

choisir le nombre(*) de "DATA_HUB"."OW_WELL_PERFORATION" WP où WP.UWI = 17038046 et supérieure(WP."OW_IS_MISRUN")!= 'Y'

1

choisir le nombre(*) de "DATA_HUB"."OW_WELL_PERFORATION" WP où WP.UWI = 17038046 et upper (WP."OW_IS_MISRUN") = 'Y'

2

choisir le nombre(*) de "DATA_HUB"."OW_WELL_PERFORATION" WP où WP.UWI = 17038046 et nvl(en haut(WP."OW_IS_MISRUN"),' N')!= 'Y'

5

-2
répondu Allan F 2017-11-16 00:48:03