Différence entre les différents types de chaînes de caractères dans SQL Server?

Quelle est la différence entre char,nchar,ntext, nvarchar,text et varchar en SQL?

Est-il vraiment un cas d'application pour chacun de ces types, ou certains d'entre eux seulement obsolète?

25
demandé sur bevacqua 2010-11-15 21:41:19

9 réponses

text et ntext sont dépréciés, alors laissons-les de côté un moment. Pour ce qui reste, il y a 3 dimensions:

  • Unicode (UCS-2) vs. non-unicode: N devant le nom indique Unicode
  • longueur fixe vs. longueur variable:var indique variable, autrement fixe
  • En-ligne vs BLOB: (max) comme la longueur dénote une tache, autrement est une valeur en ligne

donc avec ceci, vous pouvez lire la signification de n'importe quel type:

  • CHAR(10): est un en-ligne de longueur fixe de la non-Unicode de taille 10
  • NVARCHAR(256): est un Unicode de longueur variable en ligne de taille jusqu'à 256
  • VARCHAR(MAX): est-ce une GOUTTE de longueur variable non-Unicode

Le obsolète types text et ntext correspondent aux nouveaux types varchar(max) et nvarchar(max) respectivement.

quand vous allez aux détails, le sens de in-row vs. BLOB floue pour de petites longueurs comme le moteur optimiser le stockage et tirer une BLOB en ligne ou pousser une valeur en ligne dans l'unité d'allocation 'small BLOB', mais ce n'est qu'un détail d'implémentation. Voir Table des Index et de l'Organisation.

du point de vue de la programmation, tous les types:CHAR,VARCHAR,NCHAR,NVARCHAR,VARCHAR(MAX) et NVARCHAR(MAX), le soutien d'un uniforme de la chaîne d'API: Fonctions De Chaîne De Caractères. Le vieux, obsolète, types TEXT et NTEXT supportez cette API, ils ont une API de texte séparée et dépérée à manipuler. Vous ne devez pas utiliser les types dépréciés.

les types de BLOB supportent efficacement les mises à jour en place en utilisant le UPDATE table SET column.WRITE(@value, @offset) syntaxe.

la différence entre les types de longueur fixe et de longueur variable disparaît lorsque la compression de ligne sur une table. Avec la compression de ligne activée, les types de longueur fixe et la longueur variable sont stockés dans le même format et les espaces de fuite ne sont pas stockés sur le disque, voir Ligne Mise En Œuvre De La Compression. Notez que la compression de page implique la compression de ligne.

41
répondu Remus Rusanu 2010-11-15 19:18:28
  • 'n ' représente la prise en charge des caractères unicode.
  • char - spécifie une chaîne avec un stockage de longueur fixe. Espace alloué avec ou sans données présentes.
  • varchar - longueur Variable de stockage. L'espace est alloué autant que la longueur de données dans la colonne.
  • texte - pour stocker d'énormes données. L'espace alloué est de 16 octets pour le stockage en colonne.

en plus-texte et texte ont été dépréciés pour varchar (max) et nvarchar(max)

7
répondu Sachin Shanbhag 2014-05-21 21:10:16

text et ntext deprecated en faveur de varchar(max) et nvarchar(max)

3
répondu bdukes 2010-11-15 18:47:58

le préfixe n signifie simplement Unicode. Les types "n" fonctionnent de la même manière que les versions simples, sauf qu'ils fonctionnent avec du texte Unicode.

char est un champ de longueur fixe. Ainsi char (10) rempli de "Oui" prendra toujours 10 octets de stockage.

varchar est un champ de longueur variable. char (10) rempli avec "Yes" prendra 5 octets de stockage (il y a un overhead de 2 octets pour utiliser les types de données var).

char (n) Chaîne de longueur x. Stockage = n octet. varchar (n) Chaîne de maintien de longueur X. Stockage = x + 2 octets.

vchar et nvarchar sont similaires sauf qu'il est de 2 Octets par caractère.

en général, vous ne devez utiliser char & char (over varchar & nvarchar) que lorsque vous travaillez avec des chaînes fixes ou semi-fixes. Un bon exemple serait un product_code ou user_type qui est toujours long de n caractères.

vous ne devez pas utiliser de texte (ou de ntext) car il a été déprécié. varchar(max) et de type nvarchar(max) fournit la même fonctionnalité.

3
répondu Gerald Davis 2010-11-15 20:22:46

N le préfixe indique le support unicode et prend deux fois les octets par caractère de non-unicode.

Varchar est une longueur variable. Vous utilisez un 2 octets supplémentaires par champ pour stocker la longueur.

Char est de longueur fixe. Si vous savez combien de temps vos données, utilisez char comme vous vous en économiser des octets!

Text est plutôt déprécié d'après mon expérience.

méfiez-vous de l'aide de Varchar(max) et NVarchar(max) que ces champs ne peuvent pas être indexées.

2
répondu JNK 2010-11-15 18:49:15

Je ne connais qu'entre "char"et " varchar".

char: il peut allouer de la mémoire de taille spécifiée qu'elle soit remplie ou non

varchar: il attribuera la mémoire en fonction du nombre de caractères qu'il contient mais il devrait avoir une certaine taille appelée taille maximale.

0
répondu Neutralizer 2010-11-15 18:45:16

le Texte est destiné à de très grandes quantités de texte, et n'est pas destiné à être consultable (mais peut être dans certaines circonstances. Il sera lent de toute façon).

les types de données char/nchar sont de longueurs fixes, et sont capitonnés si les données entrées sont plus courtes, par opposition aux types varchar/nvarchar, qui sont de longueur variable.

les types n ont le support unicode, alors que les types non-n n'en ont pas.

0
répondu Martijn 2010-11-15 18:47:41

le Texte est obsolète.

Char est une valeur définie. Quand vous dites char(10), vous réservant 10 caractères pour chaque ligne, qu'ils soient utilisés ou non. Utilisez ceci pour quelque chose qui ne devrait pas changer de longueurs (par exemple, Code postal ou SSN)

varchar est variable. Quand vous dites varchar (10), 2 octets sont mis de côté pour stocker la taille des données, ainsi que les données réelles (qui pourraient être seulement disons, quatre octets).

le N représente le code uni. Deux fois la espace.

0
répondu Mike M. 2010-11-15 18:49:52

préfixe n: unicode. var*: longueur variable, le reste est de longueur fixe.

tous les types de données sont corrects et agréables... documenter.

Comme ici:

http://msdn.microsoft.com/en-us/library/ms187752.aspx

Est-il vraiment un cas d'application pour chacun de ces types, ou sont certains juste obsolète?

Non, il y a un bon dossier pour chacun d'eux.

0
répondu TomTom 2013-02-17 12:41:52