it-swarm.com.de

nvarchar (max) vs NText

Welche Vor- und Nachteile hat die Verwendung der Datentypen nvarchar(max) im Vergleich zu NText in SQL Server? Ich benötige keine Abwärtskompatibilität, daher wird nvarchar(max) in älteren SQL Server-Versionen nicht unterstützt.

Edit: Anscheinend gilt die Frage auch für TEXT und IMAGE vs. varchar(max) und varbinary(max), für diejenigen, die suchen nach diese Datentypen später.

175
David Pfeffer

Die Vorteile sind, dass Sie Funktionen wie LEN und LEFT für nvarchar(max) verwenden können und dies nicht für ntext und text. Es ist auch einfacher, mit nvarchar(max) zu arbeiten als mit text, wo Sie WRITETEXT und UPDATETEXT verwenden mussten.

Außerdem werden text, ntext usw. nicht mehr empfohlen ( http://msdn.Microsoft.com/en-us/library/ms187993.aspx )

186
SQLMenace

VARCHAR(MAX) ist groß genug, um das Feld TEXT aufzunehmen. Die Datentypen TEXT, NTEXT und IMAGE von SQL Server 2000 werden in zukünftigen Versionen von SQL Server veraltet sein. SQL Server 2005 bietet Abwärtskompatibilität mit Datentypen, wird jedoch empfohlen Verwenden Sie die neuen Datentypen VARCHAR(MAX), NVARCHAR(MAX) und VARBINARY(MAX).

37
garpunkal

ntext speichert seine Daten immer auf einer separaten Datenbankseite, während nvarchar(max) versucht, die Daten im Datenbankdatensatz selbst zu speichern.

Daher ist nvarchar(max) 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.

Gehe zu nvarchar(max).

32
GvS

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 ntext nicht möglich. Wirkliche Nachteile sind mir nicht bekannt.

12
Randy Minder

Der größte Nachteil von Text (zusammen mit NText und Image) ist, dass es in einer zukünftigen Version von SQL Server entfernt wird, z. B. durch die Dokumentation . Dies erschwert effektiv das Upgrade Ihres Schemas, wenn diese Version von SQL Server veröffentlicht wird.

Sie sollten anscheinend nvarchar(max) verwenden:

MSDN

4
WhiteWaterCoder

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

Hier Hier finden Sie ein vollständiges Beispiel für die Verwendung von .WRITE Klausel.

1
gotqn

Wollte meine Erfahrung mit dem Konvertieren hinzufügen. Ich hatte viele text Felder im alten Linq2SQL-Code. Dies sollte ermöglichen, dass text Spalten, die in Indizes vorhanden sind, ONLINE neu erstellt .

Zuerst wusste ich über die Vorteile seit Jahren 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.

Freut mich zu berichten, dass die ALTER-Befehle SOFORT zurückgegeben wurden - sie ändern also definitiv nur Tabellenmetadaten. Möglicherweise wird offline gearbeitet, um <8000 Zeichendaten 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 Rennen war sofort.

enter image description here

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

1
Simon_Weaver