Qu'est-ce que l'on entend par nvarchar
?
Quelle est la différence entre char
, nchar
, varchar
et nvarchar
dans SQL Server ?
Qu'est-ce que l'on entend par nvarchar
?
Quelle est la différence entre char
, nchar
, varchar
et nvarchar
dans SQL Server ?
Juste pour clarifier... ou résumer...
nchar
et nvarchar
peut stocker Unicode des personnages.char
et varchar
ne peut pas stocker l'Unicode des personnages.char
et nchar
sont longueur fixe qui réserver un espace de stockage pour le nombre de caractères spécifiés, même si vous n'utilisez pas tout l'espace.varchar
et nvarchar
sont longueur variable qui n'utilisera les espaces que pour les caractères que vous stockez. Il s'agit de ne réservera pas de stockage comme char
ou nchar
.nchar
et nvarchar
prendront deux fois plus d'espace de stockage, il peut donc être judicieux de les utiliser uniquement si vous avez besoin de Unicode soutien.
Char et varchar ne sont pas conçus pour stocker l'unicode, mais avec quelques astuces de codage et une logique supplémentaire, vous pouvez toujours utiliser un champ [var]char pour stocker l'unicode.
Cela dépend de la collation si l'option n...
les versions prennent deux fois plus d'espace de stockage comme le montre ma réponse
Toutes les réponses jusqu'à présent indiquent que varchar
est un octet unique, nvarchar
est un double octet. En fait, la première partie de ce 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
Renvoie à
Notez que le et n'étaient toujours pas représentés dans le VARCHAR
et ont été silencieusement remplacés par ?
.
En fait, 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 à un seul octet sont ceux du jeu ASCII occidental typique.
Pour cette raison, il est possible qu'un insert provenant d'une nvarchar(X)
à une colonne varchar(X)
colonne pour é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 collations SC (Supplementary Character) qui prennent en charge les éléments suivants UTF-16
. Dans ces collations, un seul nvarchar
Le caractère peut prendre 2 ou 4 octets.
Le genre de réponse que je cherchais. Pour faire gagner du temps à des personnes comme moi, le texte non anglais se traduit par "République populaire de Chine". translate.google.com/#auto/en/
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) alors que varchar ne le fait pas.
Comme les caractères Unicode nécessitent plus de stockage, les champs nchar/nvarchar prennent deux fois plus d'espace (ainsi, 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-ci .
Vous oubliez une chose : nchar utilise une longueur fixe, donc nchar(10) doit toujours recevoir dix caractères. Et varchar(10) est bien Unicode et acceptera n'importe quel nombre de caractères, jusqu'à 10 caractères. Voir aussi msdn.microsoft.com/fr/us/library/ms186939.aspx
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 souhaitez 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 enregistre le mot NIKE. Il ajoute 6 espaces à droite du mot. Ainsi, lors du filtrage, l'expression devrait être la suivante : RTRIM(Champs!BRAND.Valeur) = "NIKE".
J'espère que cela aidera quelqu'un d'autre, car j'ai eu du mal à le faire pendant un moment !
Ma tentative de résumer et de corriger les réponses existantes :
D'abord, char
et nchar
utilisera toujours une quantité fixe d'espace de stockage, même si la chaîne à stocker est plus petite que l'espace disponible, alors que varchar
et nvarchar
n'utilisera que l'espace de stockage nécessaire pour stocker cette chaîne (plus deux octets de surcharge, vraisemblablement pour stocker la longueur de la chaîne). N'oubliez pas que "var" signifie "variable", comme dans un espace variable.
Le deuxième point important à comprendre est le suivant, nchar
et nvarchar
stocker des chaînes de caractères en utilisant exactement deux octets par caractère, alors que char
et varchar
utiliser un encodage déterminé par la page de code de collationnement, qui sera généralement être exactement un octet par caractère (bien qu'il y ait des exceptions, voir ci-dessous). En utilisant deux octets par caractère, il est possible de stocker une très large gamme de caractères, de sorte que la chose fondamentale à retenir ici est que nchar
et nvarchar
sont généralement un bien meilleur choix lorsque vous souhaitez une prise en charge de l'internationalisation, ce qui est probablement le cas.
Passons maintenant à des points plus précis.
D'abord, nchar
et nvarchar
colonnes toujours stocker des données en utilisant UCS-2. Cela signifie qu'exactement deux octets par caractère seront utilisés, et que n'importe quel caractère Unicode du plan de base multilingue (BMP) peut être stocké par un fichier de type nchar
ou nvarchar
domaine. Cependant, ce n'est pas le cas tout Les caractères Unicode peuvent être stockés. Par exemple, selon Wikipedia, les points de code des hiéroglyphes égyptiens ne font pas partie du BMP. Il existe donc des chaînes Unicode qui peuvent être représentées en UTF-8 et d'autres véritables encodages Unicode qui ne peuvent pas être stockés dans un serveur SQL. nchar
ou nvarchar
et les chaînes de caractères é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 déroutant mais intéressant que d'autres posters ont souligné est que char
et varchar
Les zones 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 le chinois_Traditional_Stroke_Order_100_CS_AS_KS_WS présente ce comportement. Consultez-le).
UPDATE : Depuis SQL Server 2012, il existe enfin pages de code pour UTF-16 par exemple Latin1_General_100_CI_AS_SC, qui peut réellement couvrir toute la gamme Unicode.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.