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

StackOverflow https://stackoverflow.com/questions/176514

  •  05-07-2019
  •  | 
  •  

Question

Que signifie nvarchar ?

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

Était-ce utile?

La solution

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

  • nchar et nvarchar peuvent stocker des caractères Unicode .
  • char et varchar ne peuvent pas stocker les caractères Unicode .
  • char et nchar sont à longueur fixe ce qui réserver un 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 des longueurs variables qui n'utiliseront que des espaces pour les personnages que vous stockez. 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 de la prise en charge de Unicode . .

Autres conseils

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

Retourne

 entrez la description de l

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

Il n’existe encore aucun caractère chinois pouvant être représenté par un seul octet dans cette collation. Les seuls caractères à un octet sont les jeux ASCII occidentaux typiques.

De ce fait, il est possible d'insérer une colonne nvarchar (X) dans une colonne varchar (X) pour échouer avec une erreur de troncature (où X désigne un nombre identique dans les deux cas).

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

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 les 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 de stockage, les champs nchar / nvarchar occupent deux fois plus d’espace (ainsi, par exemple, dans les versions antérieures de SQL Server, la taille maximale d’un champ nvarchar est de 4 000).

Cette question est un doublon de celle-ci .

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 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 tout à l'heure!

Ma tentative de synthèse et de correction des réponses existantes:

D'abord, char et nchar utiliseront toujours une quantité d'espace de stockage fixe, même lorsque la chaîne à stocker est inférieure à l'espace disponible, alors que varchar et nvarchar n'utiliseront que la quantité d'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; var " signifie "variable", comme dans un espace variable.

Le deuxième point important à comprendre est que nchar et nvarchar stockent des chaînes en utilisant exactement deux octets par caractère, alors que char et varchar utilisent un codage déterminé par la page de codes de classement, qui correspondra généralement à un octet par caractère (à quelques exceptions près, voir ci-dessous). En utilisant deux octets par caractère, une très grande variété de caractères peut être stockée. Par conséquent, rappelez-vous que nchar et nvarchar ont tendance à être un bien meilleur choix. quand vous voulez le support de l'internationalisation, ce que vous faites probablement.

Maintenant quelques points plus fins.

D'abord, les colonnes nchar et nvarchar toujours stockent des données à l'aide de UCS-2. Cela signifie que exactement deux octets par caractère seront utilisés et que tout caractère Unicode du plan multilingue de base (BMP) peut être stocké par un champ nchar ou nvarchar . Cependant, aucun caractère Unicode ne peut ê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 nchar ou nvarchar de SQL Server, ainsi que des chaînes écrites. les hiéroglyphes égyptiens seraient parmi eux. Heureusement, vos utilisateurs n'écrivent probablement pas dans ce script, mais gardez bien à l'esprit!

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.)

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

  • 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

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

  • Données de chaîne Unicode de longueur fixe.
  • 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 variant.)

  • Données de chaîne Unicode de longueur variable.
  • 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, correspond à deux fois la longueur réelle des données entrées + 2 octets

char [(n)] (caractère)

  • Données de chaîne de longueur non Unicode .
  • 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 de n octets.

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

  • Données de chaîne non-Unicode de longueur variable.
  • 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.

Les différences sont les suivantes:

  1. n [var] car stocke l'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 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.)

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, la les 95 caractères restants seront remplis d'espaces. Enregistrer 5 caractères dans un varchar (100) en enregistrera 5.

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 comportent 10 caractères. et ce dernier si les longueurs varient.

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

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top