Type de text SQL Server par rapport au type de données varchar

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

Si vous utilisez SQL Server 2005 ou version ultérieure, utilisez varchar(MAX) . Le type de données text est obsolète et ne doit pas être utilisé pour un nouveau travail de développement. De la docs :

Important

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

TEXT est utilisé pour de gros morceaux de données de string. Si la longueur du champ dépasse un certain seuil, le text est stocké hors ligne.

VARCHAR est toujours stocké dans la 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 peut être stocké hors ligne, tout comme TEXT .

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

Dans les versions antérieures de SQL Server, vous ne pouviez pas accéder directement au TEXT , vous pouviez seulement get un TEXTPTR et l'utiliser dans les fonctions READTEXT et WRITETEXT .

Dans SQL Server 2005, vous pouvez accéder directement aux colonnes TEXT (bien que vous ayez besoin d'un VARCHAR explicite vers VARCHAR pour leur assigner une valeur).

TEXT est bon:

  • Si vous avez besoin de stocker de gros texts dans votre database
  • Si vous ne searchz pas sur la valeur de la colonne
  • Si vous select rarement cette colonne, ne la rejoignez pas.

VARCHAR est bon:

  • Si vous stockez des petites strings
  • Si vous effectuez une search sur la valeur de la string
  • Si vous le select toujours ou l'utilisez dans les 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 des requêtes dont le résultat dépend de la valeur de la colonne TEXT ou VARCHAR . Cela inclut l'utiliser dans n'importe quelle condition JOIN ou WHERE .

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

Quelques exemples de ce que TEXT est bon pour:

  • Commentaires de blog
  • Pages Wiki
  • Source du code

Quelques exemples de ce que VARCHAR est bon pour:

  • Noms d'user
  • Titres de page
  • Noms de files

En règle générale, si vous avez besoin de plus de 200 caractères et que vous n'utilisez pas de jointure sur cette colonne, utilisez TEXT .

Sinon, utilisez VARCHAR .

PS La même chose s'applique à NTEXT et NVARCHAR activés par UNICODE , que vous devriez utiliser pour les exemples ci-dessus.

PPS La même chose s'applique à VARCHAR(MAX) et NVARCHAR(MAX) que SQL Server 2005+ utilise au lieu de TEXT et NTEXT . Vous devrez activer les large value types out of row pour eux avec sp_tableoption si vous voulez qu'ils soient toujours stockés hors ligne.

Comme mentionné ci-dessus et ici , TEXT va être déprécié dans les prochaines versions:

L'option text in row 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 actuellement le text in row . Nous vous recommandons de stocker des données volumineuses en utilisant les types de données varchar(max) , nvarchar(max) ou varbinary(max) . Pour contrôler le comportement en ligne et hors ligne de ces types de données, utilisez l'option de large value types out of row .

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 text: ils peuvent contenir 2GB de données, mais ils ont aussi la plupart des avantages de varchar et nvarchar . Parmi ces avantages, citons la possibilité d'utiliser des fonctions de manipulation de strings telles que subssortingng ().

De plus, varchar (max) est stocké dans l'espace (disque / memory) de la table alors que la taille est inférieure à 8Kb. Ce n'est que lorsque vous placez plus de données dans le champ, il est stocké 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 le text, car il existe une meilleure alternative: (n) varchar (max). Et utilisez seulement varchar (max) quand un varchar régulier n'est pas assez grand, c'est-à-dire si vous vous attendez à ce que la string que vous allez stocker dépasse 8000 caractères.

Comme cela a été noté, vous pouvez utiliser SUBSTRING sur le type de données TEXT, mais seulement si les champs TEXT contiennent less de 8000 caractères.

Il y a eu quelques changements majeurs dans ms 2008 -> Cela vaut la peine de considérer l'article suivant quand vous prenez une décision sur le type de données à utiliser. http://msdn.microsoft.com/en-us/library/ms143432.aspx

Octets par

  1. varchar (max), colonne varbinary (max), xml, text ou image 2 ^ 31-1 2 ^ 31-1
  2. nvarchar (max) colonne 2 ^ 30-1 2 ^ 30-1