SQL Server Texttyp vs. Varchar-Datentyp [geschlossen]

287

Ich habe Zeichendaten variabler Länge und möchte sie in der SQL Server-Datenbank (2005) speichern. Ich möchte einige bewährte Methoden zur Auswahl des TEXT SQL-Typs oder des VARCHAR SQL-Typs sowie der Vor- und Nachteile in Bezug auf Leistung / Footprint / Funktion kennenlernen.

George2
quelle
17
Wenn Google Sie hierher geschickt hat: Die Seite MSDN SQL-Datentypen kann hilfreich sein.
Jeroen

Antworten:

212

Wenn Sie SQL Server 2005 oder höher verwenden, verwenden Sie varchar(MAX). Der textDatentyp ist veraltet und sollte nicht für neue Entwicklungsarbeiten verwendet werden. Aus den Dokumenten :

Wichtig

ntext,, textund imageDatentypen werden in einer zukünftigen Version von Microsoft SQL Server entfernt. Vermeiden Sie die Verwendung dieser Datentypen in neuen Entwicklungsarbeiten und planen Sie, Anwendungen zu ändern, die sie derzeit verwenden. Verwenden Sie stattdessen nvarchar (max) , varchar (max) und varbinary (max) .

Mladen Prajdic
quelle
3
Danke Mladen, ich bin überrascht zu sehen, dass TEXT veraltet ist. Haben Sie offizielle Dokumente, die dies erwähnen?
George2
1
Dies ist zwar nicht "offiziell", deckt jedoch die Grundlagen ab. Text wird in der Tat abgeschrieben und unterstützt auch nicht alles, was varchar (max) tut, wie die Fähigkeit zu suchen und zu indizieren. blog.sqlauthority.com/2007/05/26/…
achinda99
32
Dies ist so offiziell wie es nur geht :) msdn.microsoft.com/en-us/library/ms187993.aspx
Mladen Prajdic
1
Coole achinda99 und Mladen Prajdic! Was Sie zur Verfügung gestellt haben, ist das, wonach ich suche. :-) Noch eine Frage, wie wählen wir aus, ob VARCHAR oder VARCHAR (MAX) in verschiedenen Situationen verwendet werden soll?
George2
1
Offizielle MS-Informationen darüber sind veraltet: msdn.microsoft.com/en-us/library/ms187993%28v=sql.90%29.aspx
Fanda
283

TEXTwird für große Teile von Zeichenfolgendaten verwendet. Wenn die Länge des Feldes einen bestimmten Schwellenwert überschreitet, wird der Text außerhalb der Zeile gespeichert.

VARCHARwird immer in Zeilen gespeichert und ist auf 8000 Zeichen begrenzt. Wenn Sie versuchen, ein zu erstellen VARCHAR(x), wobei x> 8000 ist, wird eine Fehlermeldung angezeigt:

Server: Nachricht 131, Ebene 15, Status 3, Zeile 1

Die Größe () für den Typ 'varchar' überschreitet den maximal zulässigen Wert für einen Datentyp (8000).

Diese Längenbeschränkungen betreffen nicht VARCHAR(MAX)in SQL Server 2005 , die der Zeile gespeichert werden kann, genau wie TEXT.

Beachten Sie, dass dies MAXhier keine Art von Konstante ist VARCHARund VARCHAR(MAX)sehr unterschiedliche Typen sind, wobei letztere sehr nahe beieinander liegen TEXT.

In früheren Versionen von SQL Server konnten Sie nicht TEXTdirekt auf das zugreifen, sondern nur ein TEXTPTRund es in READTEXTund WRITETEXTFunktionen verwenden.

In SQL Server 2005 können Sie direkt auf TEXTSpalten zugreifen (obwohl Sie noch eine explizite Umwandlung benötigen VARCHAR, um ihnen einen Wert zuzuweisen).

TEXT ist gut:

  • Wenn Sie große Texte in Ihrer Datenbank speichern müssen
  • Wenn Sie nicht nach dem Wert der Spalte suchen
  • Wenn Sie diese Spalte selten auswählen und nicht beitreten.

VARCHAR ist gut:

  • Wenn Sie kleine Schnüre speichern
  • Wenn Sie nach dem Zeichenfolgenwert suchen
  • Wenn Sie es immer auswählen oder in Joins verwenden.

Mit Auswahl hier meine ich das Ausgeben von Abfragen, die den Wert der Spalte zurückgeben.

Mit Suche hier meine ich das Abgeben von Abfragen, deren Ergebnis vom Wert der Spalte TEXToder abhängt VARCHAR. Dazu gehört es in jeder Verwendung JOINoder WHEREZustand.

Da das TEXTaußerhalb der Zeile gespeichert wird, sind die Abfragen, an denen die TEXTSpalte nicht beteiligt ist, normalerweise schneller.

Einige Beispiele dafür, wofür TEXTes gut ist:

  • Blog-Kommentare
  • Wiki-Seiten
  • Codequelle

Einige Beispiele dafür, wofür VARCHARes gut ist:

  • Benutzernamen
  • Seitentitel
  • Dateinamen

Als Faustregel gilt: Wenn Sie jemals einen Textwert benötigen, der 200 Zeichen überschreitet , UND in dieser Spalte keinen Join verwenden, verwenden Sie TEXT.

Andernfalls verwenden VARCHAR.

PS Gleiches gilt für UNICODEaktiviert NTEXTund NVARCHARauch, die Sie für die obigen Beispiele verwenden sollten.

PPS Dasselbe gilt für VARCHAR(MAX)und NVARCHAR(MAX)dass SQL Server 2005+ anstelle von TEXTund verwendet NTEXT. Sie müssen large value types out of rowsie mit aktivieren , sp_tableoptionwenn Sie möchten, dass sie immer außerhalb der Zeile gespeichert werden.

Wie oben und hier erwähnt , TEXTwird es in zukünftigen Versionen veraltet sein:

Die text in rowOption wird in einer zukünftigen Version von SQL Server entfernt . Vermeiden Sie die Verwendung dieser Option in neuen Entwicklungsarbeiten und planen Sie, derzeit verwendete Anwendungen zu ändern text in row. Wir empfehlen Ihnen , große Daten speichern , indem Sie die varchar(max), nvarchar(max)oder varbinary(max)Datentypen. Verwenden Sie die large value types out of rowOption , um das In-Row- und Out-of-Row-Verhalten dieser Datentypen zu steuern .

Quassnoi
quelle
2
1. "Wenn Sie nicht nach dem Wert der Spalte suchen" - können Sie mir zeigen, was Sie unter "Suchen" verstehen? Sie meinen, wählen Sie diese Spalte aus, ordnen Sie diese Spalte, LIKE diese Spalte oder verwenden Sie eine Zeichenfolgenmanipulationsfunktion für diese Spalte?
George2
2
2. "VARCHAR wird immer in Zeilen gespeichert und ist auf 8000 Zeichen begrenzt." - Entschuldigung, ich stimme dir nicht zu. VARCHAR kann länger als 8000 sein. Wenn es länger als 8000 ist, wird VARCHAR anders als in Spalten gespeichert. Irgendwelche Kommentare?
George2
1
3. Mladen Prajdic erwähnt in diesem Thread, TEXT-Typ ist veraltet, aber ich finde keine Dokumente, die dies abdecken. Haben Sie Dokumente, die dies abdecken?
George2
2
Cooles Quassnoi! Du bist so kenntnisreich! :-) Noch eine Frage - "Dies betrifft natürlich nicht VARCHAR (MAX), was wie bei SQL SERVER 2005 ein Synonym für TEXT ist." "Das" meinst du was?
George2
"Dies betrifft natürlich nicht VARCHAR (MAX), was wie SQL SERVER 2005 ein Synonym für TEXT ist." - Haben Sie Dokumente, in denen steht, dass TEXT mit VARCHAR in SQL Server 2005 identisch ist? Ich habe etwas gesucht, kann aber keine offiziellen Dokumente finden. :-)
George2
41

In SQL Server 2005 wurden neue Datentypen eingeführt: varchar(max)und nvarchar(max) Sie haben die Vorteile des alten Texttyps: Sie können bis zu 2 GB Daten enthalten, haben aber auch die meisten Vorteile von varcharund nvarchar. Zu diesen Vorteilen gehört die Möglichkeit, Zeichenfolgenmanipulationsfunktionen wie Teilzeichenfolgen () zu verwenden.

Außerdem wird varchar (max) im Speicherplatz der Tabelle (Festplatte / Speicher) gespeichert, während die Größe unter 8 KB liegt. Nur wenn Sie mehr Daten in das Feld einfügen, werden diese außerhalb des Tabellenbereichs gespeichert. Daten, die im Tabellenbereich gespeichert sind, werden (normalerweise) schneller abgerufen.

Kurz gesagt, verwenden Sie niemals Text, da es eine bessere Alternative gibt: (n) varchar (max). Verwenden Sie varchar (max) nur, wenn ein normaler varchar nicht groß genug ist, dh wenn Sie erwarten, dass die zu speichernde Zeichenfolge 8000 Zeichen überschreitet.

Wie bereits erwähnt, können Sie SUBSTRING für den TEXT-Datentyp verwenden, jedoch nur solange die TEXT-Felder weniger als 8000 Zeichen enthalten.

edosoft
quelle
1
Vielen Dank, Edoode, Sie haben ganz geantwortet, wie gut VARCHAR ist, aber irgendwelche Kommentare oder Ideen, wann Sie VARCHAR verwenden und wann Sie TEXT verwenden sollen? Meine Frage betrifft die Auswahl von 1 aus 2 Ausgabe. :-)
George2
1
Tatsächlich können Sie in MS SQL Server 2005 SUBSTRING und andere Funktionen auch für TEXT-Spalten verwenden.
Quassnoi
1
Danke Quassnoi! Sieht aus wie TEXT ist veraltet. Noch eine Frage: Wie wählen wir aus, ob VARCHAR oder VARCHAR (MAX) in verschiedenen Situationen verwendet werden soll?
George2
1
Verwenden Sie varchar (max) nur, wenn ein normaler varchar nicht groß genug ist (8 KB sollten für alle ausreichen;)
edosoft
7

In ms 2008 wurden einige wichtige Änderungen vorgenommen -> Möglicherweise sollten Sie den folgenden Artikel berücksichtigen, wenn Sie entscheiden, welcher Datentyp verwendet werden soll. http://msdn.microsoft.com/en-us/library/ms143432.aspx

Bytes pro

  1. varchar (max), varbinary (max), xml, Text oder Bildspalte 2 ^ 31-1 2 ^ 31-1
  2. nvarchar (max) Spalte 2 ^ 30-1 2 ^ 30-1
Draz
quelle
3
Änderungen? Diese Kapazitäten haben sich seit Einführung der neuen Datentypen nicht geändert.
Martin Smith