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)
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:
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
.
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.
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 NVARCHAR2
data utilise le jeu AL16UTF16
character 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èreEn 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!