nvarchar (max) contre NText


186

Quels sont les avantages et les inconvénients de l'utilisation des types de données nvarchar(max)vs NTextdans SQL Server? Je n'ai pas besoin de compatibilité descendante, c'est donc très bien que ce nvarchar(max)ne soit pas pris en charge dans les anciennes versions de SQL Server.

Edit: Apparemment, la question s'applique également à TEXTet IMAGEcontre varchar(max)et varbinary(max), pour ceux qui recherchent ces types de données plus tard.

Réponses:


199

Les avantages sont que vous pouvez utiliser des fonctions comme LENet LEFTon nvarchar(max)et vous ne pouvez pas le faire contre ntextet text. Il est également plus facile de travailler avec nvarchar(max)que textlà où vous deviez utiliser WRITETEXTet UPDATETEXT.

En outre, text, ntext, etc., sont dépréciés ( http://msdn.microsoft.com/en-us/library/ms187993.aspx )


12
SQL Server 2016 les prendra apparemment toujours en charge.
Confluence

1
@Confluence Historiquement, le type de données text et nText est-il plus ancien que varchar et nvarchar en ce qui concerne leur existence dans SQL Server?
RBT

Vous n'avez pas besoin d'utiliser WRITETEXT et UPDATETEXT. Peut-être qu'en 2010 vous l'avez fait! Intéressé pour plus d'informations.
Simon_Weaver

39

VARCHAR(MAX)est assez grand pour accueillir le TEXTterrain. TEXT, NTEXTEt les IMAGEtypes de données de SQL Server 2000 seront dépréciés dans la version future de SQL Server, SQL Server 2005 fournit une compatibilité avec les types de données , mais il est recommandé d'utiliser de nouveaux types de données qui sont VARCHAR(MAX), NVARCHAR(MAX)et VARBINARY(MAX).


34

ntextstockera toujours ses données dans une page de base de données distincte, tout nvarchar(max)en essayant de stocker les données dans l'enregistrement de base de données lui-même.

C'est donc nvarchar(max)un peu plus rapide (si vous avez un texte de moins de 8 ko). J'ai également remarqué que la taille de la base de données augmentera légèrement plus lentement, c'est également une bonne chose.

Allez nvarchar(max).


13

nvarchar(max)est ce que vous souhaitez utiliser. Le plus grand avantage est que vous pouvez utiliser toutes les fonctions de chaîne T-SQL sur ce type de données. Ce n'est pas possible avec ntext. Je n'ai connaissance d'aucun inconvénient réel.


Ce que je ne comprends pas, c'est qu'ils disent d'aller avec nvarchar(max)mais cela me limite à 4000 caractères. Et si je veux qu'un champ contienne plus que cela?
VoidKing

2
nvarchar (max) ne vous limite pas à 4000 caractères. Vous disposez d'un nombre illimité de caractères. En outre, text et ntext ont été déconseillés par SQL Server. Cela signifie que dans une future version, ils ne seront plus pris en charge.
Randy Minder

OIC, j'utilise SQL Server CE, qui limite mon nvarchar(max)à 4000 caractères. Donc pour SQL Server Compact, je n'ai pas d'autre choix que de l'utiliser ntextdans certains cas. Quand ils arrêteront, je suppose que je devrai simplement ne pas mettre à niveau certains sites.
VoidKing

1
@RandyMinder nvarchar (max) n'est pas un stockage illimité. Selon la documentation de SQL Server, «max indique que la taille de stockage maximale est de 2 ^ 31-1 octets (2 Go). La taille de stockage, en octets, correspond à deux fois la longueur réelle des données entrées + 2 octets».
Shiv


4

Le plus gros inconvénient de Text(avec NTextet Image) est qu'il sera supprimé dans une future version de SQL Server, comme dans la documentation . Cela rendra effectivement votre schéma plus difficile à mettre à niveau lorsque cette version de SQL Server sera publiée.


4

Je voulais ajouter mon expérience avec la conversion. J'avais de nombreux textchamps dans l'ancien code Linq2SQL. C'était pour permettre aux textcolonnes présentes dans les index d'être reconstruites EN LIGNE .

D'abord, je connais les avantages depuis des années, mais j'ai toujours supposé que la conversion signifierait de longues requêtes effrayantes où SQL Server devrait reconstruire la table et tout copier, abattre mes sites Web et augmenter mon rythme cardiaque.

Je craignais également que Linq2SQL puisse provoquer des erreurs s'il effectuait une sorte de vérification du type de colonne.

Heureux de signaler cependant que les commandes ALTER sont retournées INSTANTANÉMENT - donc elles ne changent certainement que les métadonnées de la table. Il peut y avoir du travail hors ligne pour ramener <8000 caractères de données dans la table, mais la commande ALTER a été instantanée.

J'ai couru ce qui suit pour trouver toutes les colonnes nécessitant une conversion:

SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] VARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'TEXT' order by table_name, column_name

SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] NVARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'NTEXT' order by table_name, column_name

Cela m'a donné une belle liste de requêtes, que je viens de sélectionner et de copier dans une nouvelle fenêtre. Comme je l'ai dit, cela a été instantané.

entrez la description de l'image ici

Linq2SQL est assez ancien - il utilise un concepteur sur lequel vous faites glisser des tables. La situation peut être plus complexe pour EF Code d'abord, mais je ne l'ai pas encore abordé.


1

Je tiens à ajouter que vous pouvez utiliser la clause .WRITE pour les mises à jour partielles ou complètes et les ajouts haute performance aux varchar(max)/nvarchar(max)types de données.

Ici vous pouvez trouver un exemple complet de .WRITEclause using .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.