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.
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 )
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)
.
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)
.
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.
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:
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.
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.