Que veut-on dire par nvarchar
?
Quelle est la différence entre char
, nchar
, varchar
et nvarchar
dans SQL Server?
Juste pour éclaircir ... ou résumer ...
nchar
et nvarchar
peuvent stocker des caractères nicode.char
et varchar
impossible 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 .
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
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.
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 .
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!
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.
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 bitsNChar
= longueur de 16 bitsnchar[(n)]
(caractère national)
n
définit la longueur de la chaîne et doit être une valeur comprise entre 1 et 4 000.n
octets.nvarchar [(n | max)]
(caractère national variable.)
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).char [(n)]
(caractère)
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.n
octets.varchar [(n | max)]
(caractère 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).Les différences sont:
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, les 95 autres caractères seront remplis d'espaces. Stocker 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 sont de 10 caractères et la dernière 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 est de 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.