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

que signifie nvarchar ?

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

531
demandé sur PeterAllenWebb 2008-10-07 02:47:33

12 réponses

Juste pour clarifier... ou résumer...

  • nchar et nvarchar peut stocker Unicode des personnages.
  • char et varchar ne peut pas stocker les caractères Unicode .
  • char et nchar sont de longueur fixe qui va réserve d'espace de stockage pour le nombre de caractères que vous spécifiez, même si vous n'utilisez pas tout l'espace qui.
  • varchar et nvarchar sont de longueur variable qui n'utiliseront des espaces que pour les caractères que vous stockez. Il ne réserve pas de stockage comme char ou nchar .

nchar et nvarchar prendra deux fois plus d'espace de stockage, il peut être judicieux de les utiliser seulement si vous avez besoin d' Unicode .

740
répondu Brian Kim 2015-05-13 04:31:47

toutes les réponses jusqu'à présent indiquent que varchar est un octet simple, nvarchar est un octet double. La première partie de cette réellement dépend de la collation 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  

retourne

enter image description here

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

il n'y a toujours pas de caractères chinois qui puissent être représentés par un seul octet dans cette collation. Les seuls caractères simples sont l'ensemble typique des ASCII de l'Ouest.

pour cette raison il est possible qu'un insert d'une colonne nvarchar(X) à une colonne varchar(X) 1519280920" échoue avec une erreur de troncature (où X indique un nombre qui est le même dans les deux instance.)

SQL Server 2012 ajoute des collations SC (caractères supplémentaires) qui supportent UTF-16 . Dans ces collations, un seul caractère nvarchar peut prendre 2 ou 4 octets.

83
répondu Martin Smith 2017-04-13 12:42:42

nchar et char fonctionnent à peu près de la même manière l'un que l'autre, comme nvarchar et varchar. La seule différence entre eux est que nchar / nvarchar stockent des caractères Unicode (essentiel si vous avez besoin de l'utilisation de jeux de caractères étendus) tandis que varchar ne le fait pas.

parce que les caractères Unicode nécessitent plus de stockage, les champs nchar/nvarchar prennent deux fois plus de place (ainsi par exemple dans les versions précédentes de SQL Server la taille maximale d'un champ nvarchar est de 4000).

cette question est une copie de celle-ci .

33
répondu Luke Bennett 2017-05-23 12:18:30

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

donc, si vous allez filtrer votre ensemble de données par un champ 'nchar', vous pouvez utiliser RTRIM pour supprimer les espaces. E. g. nchar (10) le champ appelé BRAND stocke le mot NIKE. Il ajoute 6 espaces à la droite du mot. Ainsi, lors du filtrage, l'expression doit se lire: RTRIM (Fields!MARQUE.Valeur) = "NIKE "

espérons que cela aide quelqu'un là-bas parce que je me débattais avec elle pendant un peu juste maintenant!

31
répondu Dimuthu 2011-07-21 05:34:35

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

Première", 151900920" et nchar toujours utiliser un montant fixe de l'espace de stockage, même lorsque la chaîne pour être stockée est plus petit que l'espace disponible, alors que le varchar et nvarchar utilisera seulement l'espace de stockage est nécessaire pour stocker la chaîne (plus de deux octets de surcharge, sans doute pour stocker la longueur de la chaîne). Donc rappelez-vous," var "signifie" variable", comme dans l'espace variable.

le deuxième point majeur à comprendre est que, nchar et nvarchar stocker les chaînes en utilisant exactement deux octets par caractère, tandis que char et varchar utiliser un encodage déterminé par la page de code de collation, qui sera habituellement être exactement un octet par caractère (bien qu'il y ait des exceptions, voir ci-dessous). En utilisant deux octets par caractère, un très large éventail de caractères peut être stocké, de sorte que le la chose fondamentale à retenir ici est que nchar et nvarchar ont tendance à être un bien meilleur choix quand vous voulez un soutien à l'internationalisation, ce que vous faites probablement.

maintenant pour quelques points plus fins.

Première", 151910920" et nvarchar colonnes toujours magasin de données à l'aide de l'UCS-2. Cela signifie qu'exactement deux octets par caractère seront utilisés, et n'importe quel caractère Unicode dans le plan multilingue de base (BMP) peut être stocké dans un champ nchar ou nvarchar . Cependant, ce n'est pas le cas que n'importe quel caractère Unicode peut être stocké. Par exemple, selon Wikipedia, les points de code pour les hiéroglyphes égyptiens tombent en dehors de la BMP. Il y a donc des chaînes Unicode qui peuvent être représentées dans UTF-8 et d'autres véritables encodages Unicode qui ne peuvent pas être stockées dans le champ nchar ou nvarchar du serveur SQL, et des chaînes écrites en hiéroglyphes égyptiens en font partie. Heureusement, vos utilisateurs n'écrivent probablement pas dans ce script, mais c'est quelque chose à garder à l'esprit!

un autre point confus mais intéressant que d'autres affiches 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 collation l'exige. (Martin Smith donne un excellent exemple dans lequel il montre comment Chinese_Traditional_Stroke_Order_100_cs_as_ks_ws montre ce comportement. Check it out.)

mise à JOUR: de SQL Server 2012, il y a enfin les pages de code UTF-16 , par exemple Latin1_General_100_CI_AS_SC, qui peut vraiment couvrir l'ensemble de la palette Unicode.

20
répondu PeterAllenWebb 2013-06-27 23:35:16
  • char : données de caractères de longueur fixe avec une longueur maximale de 8000 caractères.
  • nchar : données unicode à longueur fixe d'une longueur maximale de 4000 caractères.
  • Char = longueur de 8 bits
  • NChar = longueur de 16 bits
14
répondu ss. 2009-11-02 18:17:22

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

  • de longueur Fixe Unicode chaîne de données.
  • n définit la longueur de la chaîne et doit avoir une valeur comprise entre 1 et 4 000.
  • La taille de stockage est deux fois n octets.

nvarchar [(n | max)] (national character varying.)

  • de longueur Variable Unicode chaîne de données.
  • n définit la longueur de la chaîne et peut être une valeur de 1 à 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)

  • de longueur Fixe, non-Unicode chaîne de données.
  • n définit la longueur de la chaîne et doit avoir une valeur comprise entre 1 et 8 000.
  • la taille de stockage est n octets.

varchar [(n | max)] (character varying)

  • de longueur Variable, non-Unicode chaîne de données.
  • n définit la longueur de la chaîne et peut être une valeur de 1 à 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 d'entrée + 2 octets.
9
répondu Abu Mohammad Rasel 2015-02-10 14:17:50

les différences sont:

  1. n[var]char stocke unicode tandis que [var]char stocke seulement les caractères à un octet.
  2. [n]char nécessite un nombre fixe de caractères de longueur, tandis que [n]varchar accepte un nombre variable de caractères jusqu'à et y compris la longueur définie.

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

7
répondu Wim ten Brink 2009-11-02 10:50:49

nchar exige plus d'espace nvarchar.

par exemple,

un char (100) stockera toujours 100 caractères, même si vous n'entrez que 5, Le les 95 chars restants seront garnis d'espaces. Stocker 5 caractères dans un varchar(100) permet d'enregistrer 5 caractères.

7
répondu RBT 2017-12-14 07:01:34

nchar (10) est une chaîne Unicode de longueur 10. nvarchar (10) est une chaîne Unicode de longueur variable avec une longueur maximale de 10. Typiquement, vous utiliserez le premier si toutes les valeurs de données sont de 10 caractères et le second si les longueurs varient.

5
répondu Jason Kresowaty 2008-10-06 22:53:07
  • 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
répondu Manu 2008-10-06 22:59:43

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

1
répondu Gustavo Rubio 2008-10-06 22:53:14