nvarchar (max) vs NText

183

Welche Vor- und Nachteile hat die Verwendung der Datentypen nvarchar(max)vs. NTextin SQL Server? Ich benötige keine Abwärtskompatibilität, daher ist es in Ordnung, dass nvarchar(max)dies in älteren SQL Server-Versionen nicht unterstützt wird.

Bearbeiten: Anscheinend gilt die Frage auch für TEXTund IMAGEvs. varchar(max)und varbinary(max)für diejenigen, die später nach diesen Datentypen suchen.

David Pfeffer
quelle

Antworten:

197

Die Vorteile sind, dass Sie Funktionen wie LENund LEFTweiter verwenden können nvarchar(max)und dies nicht gegen ntextund tun können text. Es ist auch einfacher, damit zu arbeiten, nvarchar(max)als textwo WRITETEXTund UPDATETEXT.

Auch text, ntextetc. werden als veraltet ( http://msdn.microsoft.com/en-us/library/ms187993.aspx )

SQLMenace
quelle
12
SQL Server 2016 wird sie anscheinend weiterhin unterstützen.
Zusammenfluss
1
@Confluence Ist Text und nText historisch gesehen ein älterer Datentyp als varchar und nvarchar, was ihre Existenz in SQL Server betrifft?
RBT
Sie MÜSSEN WRITETEXT und UPDATETEXT nicht verwenden. Vielleicht hast du es 2010 getan! Interessiert für weitere Infos.
Simon_Weaver
38

VARCHAR(MAX)ist groß genug, um TEXTFeld aufzunehmen. TEXT, NTEXTUnd IMAGEDatentypen von SQL Server 2000 werden in zukünftigen Versionen von SQL Server, SQL Server 2005 bietet Abwärtskompatibilität zu Datentypen veraltet werden , aber es wird empfohlen, neue Datentypen zu verwenden , die sind VARCHAR(MAX), NVARCHAR(MAX)und VARBINARY(MAX).

Garpunkal
quelle
32

ntextspeichert seine Daten immer auf einer separaten Datenbankseite, während nvarchar(max)versucht wird, die Daten im Datenbankeintrag selbst zu speichern.

nvarchar(max)Ist also etwas schneller (wenn Sie Text haben, der kleiner als 8 kB ist). Mir ist auch aufgefallen, dass die Datenbankgröße etwas langsamer wird, das ist auch gut so.

Geh nvarchar(max).

GvS
quelle
13

nvarchar(max)ist das, was Sie verwenden möchten. Der größte Vorteil ist, dass Sie alle T-SQL-Zeichenfolgenfunktionen für diesen Datentyp verwenden können. Dies ist mit nicht möglich ntext. Ich bin mir keiner wirklichen Nachteile bewusst.

Randy Minder
quelle
Was ich nicht verstehe ist, dass sie sagen, dass sie dazu passen, nvarchar(max)aber das beschränkt mich auf 4000 Zeichen. Was ist, wenn ich möchte, dass ein Feld mehr enthält?
VoidKing
2
nvarchar (max) beschränkt Sie nicht auf 4000 Zeichen. Sie haben eine unbegrenzte Anzahl von Zeichen. Außerdem wurden Text und ntext von SQL Server nicht mehr unterstützt. Dies bedeutet, dass sie in einer zukünftigen Version nicht mehr unterstützt werden.
Randy Minder
OIC, ich verwende SQL Server CE, wodurch meine Anzahl nvarchar(max)auf 4000 Zeichen begrenzt ist. Für SQL Server Compact habe ich keine andere Wahl, als ntextin einigen Fällen zu verwenden. Wenn sie es einstellen, muss ich wahrscheinlich einige Websites nicht aktualisieren.
VoidKing
1
@RandyMinder nvarchar (max) ist nicht unbegrenzter Speicherplatz. Gemäß der SQL Server-Dokumentation "gibt max an, dass die maximale Speichergröße 2 ^ 31-1 Byte (2 GB) beträgt. Die Speichergröße in Byte beträgt das Zweifache der tatsächlichen Länge der eingegebenen Daten + 2 Byte."
Shiv
4

Sie sollten anscheinend verwenden nvarchar(max):

MSDN

WhiteWaterCoder
quelle
4

Der größte Nachteil von Text(zusammen mit NTextund Image) ist, dass es in einer zukünftigen Version von SQL Server wie in der Dokumentation entfernt wird . Dadurch wird es schwieriger, Ihr Schema zu aktualisieren, wenn diese Version von SQL Server veröffentlicht wird.

Klaus Byskov Pedersen
quelle
3

Wollte meine Erfahrung mit dem Konvertieren hinzufügen. Ich hatte viele textFelder im alten Linq2SQL-Code. Auf diese Weise konnten textin Indizes vorhandene Spalten ONLINE neu erstellt werden .

Zuerst wusste ich jahrelang über die Vorteile Bescheid, ging aber immer davon aus, dass das Konvertieren einige beängstigende lange Abfragen bedeuten würde, bei denen SQL Server die Tabelle neu erstellen und alles kopieren müsste, um meine Websites herunterzufahren und meine Herzfrequenz zu erhöhen.

Ich war auch besorgt, dass Linq2SQL Fehler verursachen könnte, wenn es eine Art Überprüfung des Spaltentyps durchführt.

Ich freue mich jedoch darüber zu berichten, dass die ALTER-Befehle SOFORT zurückgegeben wurden - sie ändern also definitiv nur Tabellenmetadaten. Möglicherweise wird offline gearbeitet, um Daten mit <8000 Zeichen wieder in die Tabelle aufzunehmen, aber der Befehl ALTER wurde sofort ausgeführt.

Ich habe Folgendes ausgeführt, um alle Spalten zu finden, die konvertiert werden müssen:

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

Dies gab mir eine schöne Liste von Abfragen, die ich gerade ausgewählt und in ein neues Fenster kopiert habe. Wie ich schon sagte - das Laufen war sofort.

Geben Sie hier die Bildbeschreibung ein

Linq2SQL ist ziemlich alt - es verwendet einen Designer, auf den Sie Tabellen ziehen. Die Situation mag für EF Code zuerst komplexer sein, aber ich habe das noch nicht angegangen.

Simon_Weaver
quelle
1

Ich möchte hinzufügen, dass Sie die .WRITE- Klausel für teilweise oder vollständige Aktualisierungen und Hochleistungsanhänge an varchar(max)/nvarchar(max)Datentypen verwenden können.

Hier finden Sie ein vollständiges Beispiel für die Verwendung der .WRITEKlausel.

gotqn
quelle