Qu'entend-on par nvarchar
?
Quelle est la différence entre char
, nchar
, varchar
et nvarchar
dans SQL Server?
sql-server
varchar
MrDatabase
la source
la source
n...
versions occupent ou non deux fois plus d'espace de stockage que ma réponse le montreJusqu'à présent, toutes les réponses indiquent qu'il
varchar
s'agit d'un octet simple, d'nvarchar
un octet double. La première partie de cela dépend en fait du classement comme illustré ci-dessous.Retour
Notez que les caractères
华
et国
n'étaient toujours pas représentés dans laVARCHAR
version et ont été remplacés silencieusement par?
.Il n'y a en fait toujours aucun caractère chinois qui puisse être représenté par un seul octet dans ce classement. Les seuls caractères à un octet sont l'ensemble ASCII occidental typique.
De ce fait, il est possible qu'un insert d'une
nvarchar(X)
colonne à unevarchar(X)
colonne échoue 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 supplémentaire) qui prennent en charge
UTF-16
. Dans ces classements, un seulnvarchar
caractère peut prendre 2 ou 4 octets.la source
nchar et char fonctionnent à peu près de la même manière l'un que l'autre, 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) tandis que varchar ne le fait pas.
Étant donné que les caractères Unicode nécessitent plus de stockage, les champs nchar / nvarchar prennent 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 double de celle-ci .
la source
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 allez filtrer votre jeu 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 à droite du mot. Ainsi, lors du filtrage, l'expression doit se lire: RTRIM (Fields! BRAND.Value) = "NIKE"
J'espère que cela aide quelqu'un là-bas parce que je me débattais avec ça un peu tout à l'heure!
la source
Ma tentative de résumer et de corriger les réponses existantes:
Tout d'abord,
char
etnchar
utilisera toujours une quantité fixe d'espace de stockage, même lorsque la chaîne à stocker est plus petite que l'espace disponible, tandis quevarchar
etnvarchar
utilisera uniquement autant d'espace de stockage que nécessaire pour stocker cette chaîne (plus deux octets de surcharge, probablement pour stocker la longueur de la chaîne). N'oubliez donc pas que "var" signifie "variable", comme dans l'espace variable.Le deuxième point important à comprendre est que,
nchar
etnvarchar
stockez les chaînes en utilisant exactement deux octets par caractère, tandis quechar
etvarchar
utilisez un codage déterminé par la page de code de classement, qui sera généralement 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, donc la chose de base à retenir ici est celanchar
et anvarchar
tendance à être un bien meilleur choix lorsque vous souhaitez une prise en charge de l'internationalisation, ce que vous faites probablement.Maintenant pour quelques points plus fins.
Tout d' abord,
nchar
et desnvarchar
colonnes toujours stocker des données en utilisant UCS-2. Cela signifie qu'exactement 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 champnchar
ounvarchar
. Cependant, il n'est pas possible que n'importe quel 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 qui peuvent être représentées en UTF-8 et d'autres vrais encodages Unicode qui ne peuvent pas être stockés dans un serveurnchar
ou unnvarchar
champ SQL , et des chaînes écrites en hiéroglyphes égyptiens en feraient partie. Heureusement, vos utilisateurs n'écrivent probablement pas dans ce script, mais c'est quelque chose à garder à l'esprit!Une autre source de confusion , mais le point intéressant que d' autres affiches ont mis en évidence que
char
et lesvarchar
champs peuvent utiliser deux octets par caractère pour certains caractères si la page de code de classement 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. Vérifiez-le.)MISE À JOUR: Depuis SQL Server 2012, il existe enfin des pages de codes pour UTF-16 , par exemple Latin1_General_100_CI_AS_SC, qui peuvent vraiment couvrir toute la plage Unicode.
la source
char
: données de caractères de longueur fixe avec une longueur maximale de 8000 caractères.nchar
: données unicode de longueur fixe avec une longueur maximale de 4000 caractères.Char
= Longueur 8 bitsNChar
= Longueur de 16 bitsla source
char
ne pouvait pas avoir une longueur de 8 bits. Il n'a pas besoin de stocker la longueur et la longueur fixe peut contenir jusqu'à 8 000 caractères.nchar[(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)]
(personnage)non-Unicode
Données de chaîne 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).la source
Les différences sont les suivantes:
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.)
la source
nchar nécessite plus d'espace que nvarchar.
par exemple,
Un nchar (100) stockera toujours 100 caractères même si vous n'en saisissez que 5, les 95 caractères restants seront remplis d'espaces. Stocker 5 caractères dans un nvarchar (100) économisera 5 caractères.
la source
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 seconde si les longueurs varient.
la source
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 stockage d'octets par caractère.
la source
UCS-2
(qui se trouve être le codage utilisé par SQL Server) stocke tous les caractères dans exactement deux octets, voir msdn.microsoft.com/en-us/library/bb330962%28v=sql.90%29.aspx :SQL Server stores Unicode in the UCS-2 encoding scheme... UCS-2 is a fixed-length encoding that represents all characters as a 16-bit value (2 bytes)
. SQL Server 2008 peut utiliser la compression SCSU, mais est toujours la compression des chaînes Unicode codées UCS-2: msdn.microsoft.com/en-us/library/ee240835.aspxNVARCHAR peut stocker des caractères Unicode et prend 2 octets par caractère.
la source
nvarchar
prend toujours 2 octets par caractère.