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


Ce que l'on entend par nvarchar?

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


516
2017-10-06 22:47


origine


Réponses:


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

  • nchar et nvarchar Peut stocker Unicode personnages.
  • char et varchar  ne peut pas stocker Unicode personnages.
  • char et nchar sont 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 cet espace.
  • varchar et nvarchar sont longueur variable qui n'utilisera que des espaces pour les personnages que vous stockez. Il ne réserve pas le stockage comme char ou nchar.

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


721
2017-10-06 23:02



Toutes les réponses indiquent que varchar est un octet unique, nvarchar  est double octet. La première partie de cette réalité 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  

Résultats

enter image description here

Notez que le  et  les personnages n'étaient toujours pas représentés dans le VARCHAR version et ont été silencieusement remplacés par ?.

Il n'y a toujours pas de caractères chinois qui peuvent être représentés par un seul octet dans cette collation. Les seuls caractères d'un seul octet sont l'ensemble ASCII occidental typique.

De ce fait, il est possible pour un insert d'un nvarchar(X) colonne à un varchar(X) colonne échouer avec une erreur de troncature (où X désigne un nombre qui est le même dans les deux cas).

SQL Server 2012 ajoute des classements SC (caractère supplémentaire) prenant en charge UTF-16. Dans ces collations un seul nvarchar le caractère peut prendre 2 ou 4 octets.


79
2017-11-23 23:37



nchar et char fonctionnent à peu près exactement de la même manière, tout comme nvarchar et varchar. La seule différence entre eux est que nchar / nvarchar stocke les caractères Unicode (essentiel si vous avez besoin d'utiliser des jeux de caractères étendus) alors que varchar ne le fait pas.

Les caractères Unicode nécessitant plus 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 4000).

Cette question est un doublon de celui-là.


33
2017-10-06 22:51



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.

Donc, si vous voulez filtrer votre ensemble de données par 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 du mot. 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 pour le moment!


30
2017-07-21 05:34



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

Premier, char et nchar utilisera toujours une quantité fixe d'espace de stockage, même lorsque la chaîne à stocker est plus petite que l'espace disponible, alors que varchar et nvarcharn'utilisera que l'espace de stockage nécessaire pour stocker cette chaîne (plus deux octets de préfixe, vraisemblablement pour stocker la longueur de la chaîne). Alors rappelez-vous, "var" signifie "variable", comme dans l'espace variable.

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

Maintenant, pour certains points plus fins.

Premier, nchar et nvarchar colonnes toujours stocker des données en utilisant UCS-2. Cela signifie que deux octets par caractère seront utilisés, et tout caractère Unicode dans le plan multilingue de base (BMP) peut être stocké par un nchar ou nvarchar champ. Cependant, ce n'est pas le cas tout Le caractère Unicode peut être stocké. Par exemple, selon Wikipedia, les points de code pour les hiéroglyphes égyptiens tombent en dehors du BMP. Il y a donc des chaînes Unicode qui peuvent être représentées dans UTF-8 et d'autres vrais codages Unicode qui ne peuvent pas être stockés dans un serveur SQL. nchar ou nvarchar champ, et les chaînes écrites dans les hiéroglyphes égyptiens seraient parmi eux. 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 char et varchar les champs peuvent utiliser deux octets par caractère pour certains caractères si la page de code de classement l'exige. (Martin Smith donne un excellent exemple dans lequel il montre comment Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS présente ce comportement.

METTRE À JOUR: À partir de SQL Server 2012, il y a enfin pages de codes pour UTF-16, par exemple Latin1_General_100_CI_AS_SC, qui peut vraiment couvrir toute la plage Unicode.


20
2018-06-27 05:41



  • char: données de caractères de longueur fixe d'une longueur maximale de 8000 caractères.
  • nchar: données Unicode de longueur fixe d'une longueur maximale de 4000 caractères.
  • Char = Longueur de 8 bits
  • NChar = 16 bits

14
2017-11-02 09:35



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

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

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

  • Longueur variable Unicode données de chaîne.
  • 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)] (personnage)

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

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

  • Longueur variable, non-Unicode données de chaîne.
  • 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 entrées + 2 octets.

9
2018-02-10 14:17



Les différences sont:

  1. n [var] char stocke unicode alors que [var] char stocke uniquement les caractères à un octet.
  2. [n] char requiert un nombre fixe de caractères de la longueur exacte 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 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) qui peut gérer jusqu'à 2 147 483 648 caractères. (Deux gigaoctets, un entier signé de 4 octets.)


7
2017-11-02 10:33