web-dev-qa-db-fra.com

Quelle est la différence entre char, nchar, varchar et nvarchar dans SQL Server?

Que veut-on dire par nvarchar?

Quelle est la différence entre char, nchar, varchar et nvarchar dans SQL Server?

584
MrDatabase

Juste pour éclaircir ... ou résumer ...

  • nchar et nvarchar peuvent stocker des caractères nicode.
  • char et varcharimpossible de stocker Unicode caractères.
  • char et nchar sont longueur fixe qui va réserver de l'espace de stockage pour le nombre de caractères que vous spécifiez même ne pas utiliser tout cet espace.
  • varchar et nvarchar sont longueur variable qui n'utilisera que des espaces pour les caractères que vous enregistrez. Il ne réservera pas de stockage comme char ou nchar.

nchar et nvarchar occuperont deux fois plus d'espace de stockage. Il peut donc être judicieux de les utiliser uniquement si vous avez besoin du support Unicode .

814
Brian Kim

Jusqu'à présent, toutes les réponses indiquent que varchar est un octet simple, nvarchar est un octet double. La première partie de ce travail dépend du classement , comme illustré ci-dessous.

DECLARE @T TABLE
(
C1 VARCHAR(20) COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS,
C2 NVARCHAR(20)COLLATE  Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS
)

INSERT INTO @T 
    VALUES (N'中华人民共和国',N'中华人民共和国'),
           (N'abc',N'abc');

SELECT C1,
       C2,
       LEN(C1)        AS [LEN(C1)],
       DATALENGTH(C1) AS [DATALENGTH(C1)],
       LEN(C2)        AS [LEN(C2)],
       DATALENGTH(C2) AS [DATALENGTH(C2)]
FROM   @T  

Résultats

enter image description here

Notez que les caractères et n'étaient toujours pas représentés dans la version VARCHAR et ont été remplacés silencieusement par ?.

En réalité, il n’ya toujours pas de caractères chinois pouvant être représentés par un seul octet dans cette collation. Les seuls caractères à un seul octet sont les jeux occidentaux ASCII typiques.

De ce fait, il est possible qu’une insertion d’une colonne nvarchar(X) dans une colonne varchar(X)échoue avec une erreur de troncature ( où X désigne un nombre identique dans les deux cas).

SQL Server 2012 ajoute les classements SC (caractères supplémentaires) prenant en charge UTF-16. Dans ces classements, un seul caractère nvarchar peut prendre 2 ou 4 octets.

91
Martin Smith

nchar et char fonctionnent à peu près de la même manière, à l’instar de nvarchar et de varchar. La seule différence entre eux est que nchar/nvarchar stocke des caractères Unicode (indispensable si vous avez besoin d’utiliser des jeux de caractères étendus), contrairement à varchar.

Étant donné que les caractères Unicode nécessitent davantage d'espace de stockage, les champs nchar/nvarchar occupent deux fois plus d'espace (par exemple, dans les versions antérieures de SQL Server, la taille maximale d'un champ nvarchar est de 4 000).

Cette question est une copie de celle-ci .

33
Luke Bennett

Juste pour ajouter quelque chose de plus: nchar - ajoute des espaces de fin aux données. nvarchar - n'ajoute pas d'espaces de fin aux données.

Ainsi, si vous envisagez de filtrer votre ensemble de données en utilisant un champ "nchar", vous pouvez utiliser RTRIM pour supprimer les espaces. Par exemple. Le champ nchar (10) appelé BRAND stocke le mot NIKE. Il ajoute 6 espaces à la droite de la Parole. Ainsi, lors du filtrage, l'expression devrait être: RTRIM (Fields! BRAND.Value "NIKE") ==

J'espère que cela aide quelqu'un parce que je me débattais un peu tout à l'heure!

32
Dimuthu

Ma tentative de résumer et de corriger les réponses existantes:

Tout d'abord, char et nchar utiliseront toujours une quantité d'espace de stockage fixe, même lorsque la chaîne à stocker est plus petite que l'espace disponible, alors que varchar et nvarchar utilisez uniquement l'espace de stockage nécessaire pour stocker cette chaîne (plus deux octets de surcharge, probablement pour stocker la longueur de la chaîne). Alors rappelez-vous, "var" signifie "variable", comme dans un espace variable.

Le deuxième point important à comprendre est que, nchar et nvarchar stockent les chaînes en utilisant exactement ​​deux octets par caractère, alors que char et varchar utilisent un le codage déterminé par la page de code de classement, qui généralement ​​correspondra exactement à un octet par caractère (bien qu'il existe des exceptions, voir ci-dessous). En utilisant deux octets par caractère, une très grande variété de caractères peut être stockée. Le point fondamental à retenir est que nchar et nvarchar tendent à être un bien meilleur choix lorsque vous souhaitez prendre en charge l'internationalisation. ce que vous faites probablement.

Maintenant, pour quelques points plus fins.

Tout d'abord, nchar et nvarchar colonnes toujours stockent les données à l'aide de UCS-2. Cela signifie que vous utiliserez exactement deux octets par caractère et que tout caractère Unicode du plan multilingue de base (BMP) peut être stocké dans un champ nchar ou nvarchar. Cependant, il n’est pas vrai que tout ​​caractère Unicode puisse être stocké. Par exemple, selon Wikipedia, les points de code pour les hiéroglyphes égyptiens ne relèvent pas du BMP. Il existe donc des chaînes Unicode pouvant être représentées dans UTF-8 et d’autres codages Unicode véritables qui ne peuvent pas être stockés dans un champ SQL Server nchar ou nvarchar, et des chaînes écrites dans des hiéroglyphes égyptiens leur. Heureusement, vos utilisateurs n'écrivent probablement pas dans ce script, mais il faut en tenir compte!

Un autre point troublant mais intéressant que d'autres afficheurs ont mis en évidence est que les champs char et varchar peuvent utiliser deux octets par caractère pour certains caractères si la page de code de classement le requiert. (Martin Smith donne un excellent exemple dans lequel il montre comment Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS présente ce comportement. Vérifiez-le.)

UPDATE: À partir de SQL Server 2012, il existe enfin pages de codes pour UTF-16 , par exemple Latin1_General_100_CI_AS_SC, qui peut réellement couvrir toute la gamme Unicode.

22
PeterAllenWebb
  • char: données de caractère de longueur fixe d'une longueur maximale de 8 000 caractères.
  • nchar: données unicode de longueur fixe d'une longueur maximale de 4000 caractères.
  • Char = longueur de 8 bits
  • NChar = longueur de 16 bits
14
ss.

nchar[(n)] (caractère national)

  • Longueur fixe nicode données de chaîne.
  • n définit la longueur de la chaîne et doit être une valeur comprise entre 1 et 4 000.
  • La taille de stockage est deux fois n octets.

nvarchar [(n | max)] (caractère national variable.)

  • Longueur variable nicode chaîne de données.
  • n définit la longueur de la chaîne et peut être une valeur comprise entre 1 et 4 000.
  • max indique que la taille de stockage maximale est de 2 ^ 31-1 octets (2 Go).
  • La taille de stockage, en octets, est deux fois la longueur réelle des données entrées + 2 octets.

char [(n)] (caractère)

  • Données de chaîne non-Unicode de longueur fixe.
  • n définit la longueur de la chaîne et doit être une valeur comprise entre 1 et 8 000.
  • La taille de stockage est n octets.

varchar [(n | max)] (caractère variable)

  • Longueur variable, non Unicode chaîne de données.
  • n définit la longueur de la chaîne et peut être une valeur comprise entre 1 et 8 000.
  • max indique que la taille de stockage maximale est de 2 ^ 31-1 octets (2 Go).
  • La taille de stockage est la longueur réelle des données saisies + 2 octets.
9
Abu Mohammad Rasel

Les différences sont:

  1. n [var] char stocke unicode alors que [var] char stocke uniquement des caractères à un octet.
  2. [n] char nécessite un nombre fixe de caractères de la longueur exacte, tandis que [n] varchar accepte un nombre variable de caractères allant jusqu'à la longueur définie incluse.

Une autre différence est la longueur. Nchar et nvarchar peuvent contenir jusqu'à 4 000 caractères. Et char et varchar peuvent contenir jusqu'à 8 000 caractères. Mais pour SQL Server, vous pouvez également utiliser un [n] varchar (max) pouvant gérer jusqu'à 2 147 483 648 caractères. (Deux gigaoctets, un entier signé de 4 octets.)

7
Wim ten Brink

nchar nécessite plus d'espace que nvarchar.

par exemple,

Un caractère (100) stockera toujours 100 caractères même si vous n'en entrez que 5, les 95 autres caractères seront remplis d'espaces. Stocker 5 caractères dans un varchar (100) en enregistrera 5.

7
Sunil

nchar (10) est une chaîne Unicode de longueur fixe de longueur 10. nvarchar (10) est une chaîne Unicode de longueur variable avec une longueur maximale de 10. En règle générale, vous utiliseriez la première si toutes les valeurs de données sont de 10 caractères et la dernière si les longueurs varient.

5
Jason Kresowaty
  • nchar est de longueur fixe et peut contenir des caractères unicode. il utilise deux octets de stockage par caractère.

  • varchar est de longueur variable et ne peut pas contenir de caractères unicode. il utilise un octet de stockage par caractère.

4
Manu

NVARCHAR peut stocker des caractères Unicode et prend 2 octets par caractère.

1
Gustavo Rubio