Type de texte SQL Server vs type de données varchar [fermé]

287

J'ai des données de caractères de longueur variable et je souhaite les stocker dans la base de données SQL Server (2005). Je veux apprendre quelques bonnes pratiques sur la façon de choisir le type SQL TEXT ou choisir le type SQL VARCHAR, les avantages et les inconvénients en termes de performances / d'encombrement / de fonction.

George2
la source
17
Si Google vous a envoyé ici: la page MSDN SQL Data Types peut vous aider.
Jeroen

Réponses:

212

Si vous utilisez SQL Server 2005 ou version ultérieure, utilisez varchar(MAX). Le texttype de données est obsolète et ne doit pas être utilisé pour de nouveaux travaux de développement. De la documentation :

Important

ntext, textet imageles types de données seront supprimés dans une future version de Microsoft SQL Server. Évitez d'utiliser ces types de données dans de nouveaux travaux de développement et prévoyez de modifier les applications qui les utilisent actuellement. Utilisez plutôt nvarchar (max) , varchar (max) et varbinary (max) .

Mladen Prajdic
la source
3
Merci Mladen, je suis surpris de voir que TEXT est déconseillé. Avez-vous des documents officiels le mentionnant?
George2
1
Bien que ce ne soit pas «officiel», il couvre les bases. Le texte est en fait déprécié et ne prend pas en charge tout ce que fait varchar (max), comme la possibilité de rechercher et d'indexer. blog.sqlauthority.com/2007/05/26/…
achinda99
32
c'est aussi officiel que possible :) msdn.microsoft.com/en-us/library/ms187993.aspx
Mladen Prajdic
1
Cool achinda99 et Mladen Prajdic! Ce que vous avez fourni est ce que je recherche. :-) Encore une question, comment choisissons-nous d'utiliser VARCHAR ou VARCHAR (MAX) dans différentes situations?
George2
1
Les informations officielles de MS à ce sujet sont obsolètes: msdn.microsoft.com/en-us/library/ms187993%28v=sql.90%29.aspx
Fanda
283

TEXTest utilisé pour les gros morceaux de données de chaîne. Si la longueur du champ dépasse un certain seuil, le texte est stocké hors ligne.

VARCHARest toujours stocké en ligne et a une limite de 8000 caractères. Si vous essayez de créer un VARCHAR(x), où x> 8000 , vous obtenez une erreur:

Serveur: Msg 131, niveau 15, état 3, ligne 1

La taille () donnée au type 'varchar' dépasse le maximum autorisé pour tout type de données (8000)

Ces limitations de longueur ne concernent pas VARCHAR(MAX)dans SQL Server 2005 , qui peuvent être stockés hors de la ligne, tout comme TEXT.

Notez que ce MAXn'est pas une sorte de constante ici, VARCHARet ce VARCHAR(MAX)sont des types très différents, ce dernier étant très proche TEXT.

Dans les versions précédentes de SQL Server , vous ne pouviez pas accéder au TEXTdirectement, vous ne pourriez obtenir un TEXTPTRet l' utiliser dans READTEXTet WRITETEXTfonctions.

Dans SQL Server 2005, vous pouvez accéder directement aux TEXTcolonnes (bien que vous ayez toujours besoin d'une conversion explicite pour VARCHARleur attribuer une valeur).

TEXT est bon:

  • Si vous avez besoin de stocker de gros textes dans votre base de données
  • Si vous ne recherchez pas la valeur de la colonne
  • Si vous sélectionnez rarement cette colonne et ne vous y joignez pas.

VARCHAR est bon:

  • Si vous stockez de petites cordes
  • Si vous recherchez la valeur de chaîne
  • Si vous le sélectionnez toujours ou l'utilisez dans des jointures.

En sélectionnant ici, je veux dire émettre toutes les requêtes qui renvoient la valeur de la colonne.

En recherchant ici, je veux dire émettre toutes les requêtes dont le résultat dépend de la valeur de la colonne TEXTou VARCHAR. Cela inclut l' utilisation dans une JOINou WHEREcondition.

Comme le TEXTest stocké hors ligne, les requêtes n'impliquant pas la TEXTcolonne sont généralement plus rapides.

Quelques exemples de ce qui TEXTest bon pour:

  • Commentaires du blog
  • Pages wiki
  • Source de code

Quelques exemples de ce qui VARCHARest bon pour:

  • Noms d'utilisateur
  • Titres de page
  • Noms de fichiers

En règle générale, si vous avez besoin d'une valeur de texte supérieure à 200 caractères ET que vous n'utilisez pas de jointure dans cette colonne, utilisez TEXT.

Sinon, utilisez VARCHAR.

PS La même chose s'applique à UNICODEactivé NTEXTet NVARCHARainsi, que vous devez utiliser pour les exemples ci-dessus.

PPS La même chose s'applique à VARCHAR(MAX)et NVARCHAR(MAX)que SQL Server 2005+ utilise à la place de TEXTet NTEXT. Vous devrez les activer large value types out of rowavec sp_tableoptionsi vous souhaitez qu'ils soient toujours stockés hors ligne.

Comme mentionné ci-dessus et ici , TEXTva être déconseillé dans les futures versions:

L' text in rowoption sera supprimée dans une future version de SQL Server . Évitez d'utiliser cette option dans les nouveaux travaux de développement et prévoyez de modifier les applications qui utilisent actuellementtext in row . Nous vous recommandons de stocker des données volumineuses en utilisant les varchar(max), nvarchar(max)ou les varbinary(max)types de données. Pour contrôler le comportement en ligne et hors ligne de ces types de données, utilisez l' large value types out of rowoption.

Quassnoi
la source
2
1. "Si vous ne recherchez pas sur la valeur de la colonne" - pourriez-vous me montrer ce que vous voulez dire par "rechercher"? Vous voulez dire sélectionner cette colonne, commander cette colonne, COMME cette colonne ou utiliser une fonction de manipulation de chaîne sur cette colonne?
George2
2
2. "VARCHAR est toujours stocké en ligne et a une limite de 8 000 caractères." - désolé, je ne suis pas d'accord avec vous. VARCHAR peut être supérieur à 8000 et s'il est supérieur à 8000, VARCHAR sera stocké autrement que dans des colonnes. Des commentaires?
George2
1
3. Mladen Prajdic mentionné dans ce fil, le type TEXT est déconseillé, mais je ne trouve aucun document couvrant cela. Avez-vous des documents à ce sujet?
George2
2
Cool Quassnoi! Vous êtes tellement connaissable! :-) Encore une question - "Ceci ne concerne bien sûr pas VARCHAR (MAX), qui est comme pour SQL SERVER 2005 un synonyme de TEXT." "Ce" tu veux dire quoi?
George2
"Cela ne concerne bien sûr pas VARCHAR (MAX), qui est comme pour SQL SERVER 2005 un synonyme de TEXT." - avez-vous des documents indiquant que TEXT est le même que VARCHAR dans SQL Server 2005? J'ai fait quelques recherches mais je ne trouve pas de documents officiels. :-)
George2
41

Dans SQL Server 2005, de nouveaux types de données ont été introduits: varchar(max) et nvarchar(max) Ils ont les avantages de l'ancien type de texte: ils peuvent contenir op à 2 Go de données, mais ils ont également la plupart des avantages de varcharet nvarchar. Parmi ces avantages, il y a la possibilité d'utiliser des fonctions de manipulation de chaînes telles que substring ().

En outre, varchar (max) est stocké dans l'espace (disque / mémoire) de la table tandis que la taille est inférieure à 8 Ko. Ce n'est que lorsque vous placez plus de données dans le champ, qu'elles sont stockées hors de l'espace de la table. Les données stockées dans l'espace de la table sont (généralement) récupérées plus rapidement.

En bref, n'utilisez jamais Text, car il existe une meilleure alternative: (n) varchar (max). Et n'utilisez varchar (max) que si un varchar normal n'est pas assez grand, c'est-à-dire si vous vous attendez à ce que la chaîne que vous allez stocker dépasse 8000 caractères.

Comme indiqué précédemment, vous pouvez utiliser SUBSTRING sur le type de données TEXT, mais uniquement tant que les champs TEXT contiennent moins de 8 000 caractères.

edosoft
la source
1
Merci Edoode, vous avez répondu dans son ensemble à quel point VARCHAR est bon, mais avez-vous des commentaires ou des idées sur le moment d'utiliser VARCHAR et quand utiliser TEXT? Ma question porte sur le choix du numéro 1 parmi 2. :-)
George2
1
En fait, dans MS SQL Server 2005, vous pouvez également utiliser SUBSTRING et d'autres fonctions sur les colonnes TEXT.
Quassnoi
1
Merci Quassnoi! On dirait que TEXT est obsolète. Une autre question, comment choisissons-nous d'utiliser VARCHAR ou VARCHAR (MAX) dans différentes situations?
George2
1
N'utilisez varchar (max) que lorsqu'un varchar normal n'est pas assez grand (8 Ko devraient suffire à tout le monde;)
edosoft
7

Il y a eu quelques changements majeurs dans ms 2008 -> Il pourrait être utile de considérer l'article suivant lors de la prise de décision sur le type de données à utiliser. http://msdn.microsoft.com/en-us/library/ms143432.aspx

Octets par

  1. varchar (max), varbinary (max), xml, texte ou colonne d'image 2 ^ 31-1 2 ^ 31-1
  2. nvarchar (max) colonne 2 ^ 30-1 2 ^ 30-1
Draz
la source
3
Changements? Ces capacités n'ont pas changé depuis l'introduction des nouveaux types de données.
Martin Smith