web-dev-qa-db-fra.com

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 les chaînes multi-octets, quelle est la différence exacte entre ces deux définitions de colonne? 

VARCHAR2(10 CHAR)
NVARCHAR2(10)
48
Álvaro González

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

Une raison pour laquelle vous souhaiterez peut-être utiliser NVARCHAR2 pourrait être que votre base de données utilise un jeu de caractères non-Unicode et que vous souhaitez toujours pouvoir stocker des données Unicode pour certaines colonnes sans modifier le jeu de caractères principal. Une autre raison peut être que vous souhaitez utiliser deux jeux de caractères Unicode (AL32UTF8 pour les données provenant principalement d'Europe occidentale et AL16UTF16 pour les données provenant principalement d'Asie, par exemple), car différents jeux de caractères ne stockent pas les mêmes données de manière aussi efficace.

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

Notez également que certaines fonctionnalités ne fonctionnent pas avec NVARCHAR2, consultez cette question SO:

82
Vincent Malgrat

Je ne pense pas que la réponse de Vincent Malgrat soit correcte. Lorsque NVARCHAR2 était introduit il y a longtemps, personne ne parlait même d'Unicode.

Initialement, Oracle fournissait VARCHAR2 et NVARCHAR2 pour prendre en charge la localisation. Les données communes (inclure PL/SQL) étaient conservées dans VARCHAR2, probablement US7ASCII ces jours-ci. Ensuite, vous pouvez appliquer NLS_NCHAR_CHARACTERSET individuellement (par exemple WE8ISO8859P1) à chacun de vos clients dans n'importe quel pays sans toucher à la partie commune de votre application.

De nos jours, le jeu de caractères AL32UTF8 est la valeur par défaut qui supporte pleinement Unicode. À mon avis, aujourd’hui, il n’ya plus de raison d’utiliser NLS_NCHAR_CHARACTERSET, c’est-à-dire NVARCHAR2, NCHAR2, NCLOB. La seule raison est peut-être lorsque vous devez prendre en charge principalement les caractères asiatiques où AL16UTF16 consomme moins d'espace de stockage par rapport à AL32UTF8.

1

nVarchar2 est un stockage Unicode -uniquement.

Bien que les deux types de données soient des types de données String de longueur variable, vous pouvez remarquer la différence dans la manière dont ils stockent les valeurs. Chaque caractère est stocké en octets. Comme nous le savons, toutes les langues ne possèdent pas un alphabet de même longueur. Par exemple, l'alphabet anglais nécessite 1 octet par caractère. Toutefois, des langues telles que le japonais ou le chinois nécessitent plus d'un octet pour stocker un caractère.

Lorsque vous spécifiez varchar2 (10)}, vous indiquez au DB que seul _ {10 octets} de données seront stockées. Mais, lorsque vous dites nVarchar2 (10) _, cela signifie que 10 caractères sera stocké. Dans ce cas, vous n'avez pas à vous soucier du nombre d'octets que prend chaque caractère.

0
Pooja
  • Le NVARCHAR2 stocke des données de caractères de longueur variable. Lorsque vous créez une table avec la colonne NVARCHAR2, la taille maximale est toujoursin sémantique de longueur de caractère, qui est également la sémantique par défaut et seule longueur pour le type de données NVARCHAR2.

    Le type NVARCHAR2data utilise le jeu AL16UTF16character qui code les données Unicode dans le codage UTF-16. _ {Le AL16UTF16 utilise 2 bytes pour stocker un caractère} _. De plus, la longueur maximale en octets d'un NVARCHAR2 dépend du jeu de caractères national configuré.

  • VARCHAR2 La taille maximale de VARCHAR2 peut être en octets ou en caractères. Seule sa colonne peut stocker des caractères dans le caractère par défaut Défini tandis que le NVARCHAR2 peut stocker virtuellement tous les caractères. Un seul caractère peut nécessiter jusqu'à 4 bytes.

En définissant le champ comme:

  • VARCHAR2(10 CHAR) vous dites à Oracle qu’il peut utiliser suffisamment d’espace pour stocker 10 caractères, quel que soit le nombre d’octets nécessaires à leur stockage. Un seul caractère peut nécessiter jusqu'à 4 bytes.
  • NVARCHAR2(10) vous dites à Oracle qu’il peut stocker 10 caractères avec 2 bytes par caractère

En résumé: 

  • VARCHAR2(10 CHAR) peut stocker un maximum de 10 characters et un maximum de 40 bytes (dépend du jeu de caractères national configuré).

  • NVARCHAR2(10) peut stocker un maximum de 10 characters et un maximum de 20 bytes (dépend du jeu de caractères national configuré).

Remarque: Le jeu de caractères peut être UTF-8, UTF-16, ....

Veuillez regarder ce tutoriel pour plus de détails.

Bonne journée!

0
Chivorn