480 Stimmen

Unterschied zwischen VARCHAR und TEXT in MySQL

Wenn wir in MySQL eine Tabelle mit einer VARCHAR-Spalte erstellen, müssen wir die Länge festlegen. Aber für den TEXT-Typ müssen wir die Länge nicht angeben.

Was sind die Unterschiede zwischen VARCHAR und TEXT?

816voto

AbcAeffchen Punkte 13534

Zusammenfassung

TEXT

  • festgelegte maximale Größe von 65535 Zeichen (Sie können die maximale Größe nicht begrenzen)
  • belegt 2 + c Bytes auf der Festplatte, wobei c die Länge des gespeicherten Strings ist.
  • kann nicht (vollständig) Teil eines Index sein. Es muss eine Präfixlänge angegeben werden.

VARCHAR(M)

  • variable maximale Größe von M Zeichen
  • M muss zwischen 1 und 65535 liegen
  • belegt 1 + c Bytes (für M ≤ 255) oder 2 + c Bytes (für 256 ≤ M ≤ 65535) auf der Festplatte, wobei c die Länge des gespeicherten Strings ist
  • kann Teil eines Index sein

Weitere Details

TEXT hat eine festgelegte maximale Größe von 2¹-1 = 65535 Zeichen.
VARCHAR hat eine variable maximale Größe von M bis zu M = 2¹-1.
Sie können also die Größe von TEXT nicht wählen, aber für ein VARCHAR können Sie es.

Der andere Unterschied besteht darin, dass Sie keinen Index (außer einem Volltextindex) auf einer TEXT-Spalte platzieren können.
Wenn Sie also einen Index auf der Spalte haben möchten, müssen Sie VARCHAR verwenden. Beachten Sie jedoch, dass die Länge eines Index ebenfalls begrenzt ist. Wenn Ihre VARCHAR-Spalte zu lang ist, müssen Sie nur die ersten paar Zeichen der VARCHAR-Spalte in Ihrem Index verwenden (Siehe die Dokumentation für CREATE INDEX).

Aber Sie sollten auch VARCHAR verwenden, wenn Sie wissen, dass die maximale Länge des möglichen Eingabestrings nur M beträgt, z.B. eine Telefonnummer oder einen Namen oder etwas Ähnliches. Dann können Sie anstelle von TINYTEXT oder TEXT VARCHAR(30) verwenden und wenn jemand versucht, den Text aller drei "Herr der Ringe"-Bücher in Ihrer Telefonnummernspalte zu speichern, speichern Sie nur die ersten 30 Zeichen :)

Bearbeitet: Wenn der Text, den Sie in der Datenbank speichern möchten, länger als 65535 Zeichen ist, müssen Sie MEDIUMTEXT oder LONGTEXT wählen, aber Vorsicht: MEDIUMTEXT speichert Strings bis zu 16 MB, LONGTEXT bis zu 4 GB. Wenn Sie LONGTEXT verwenden und die Daten über PHP abrufen (zumindest wenn Sie mysqli ohne store_result verwenden), erhalten Sie möglicherweise einen Speicherzuweisungsfehler, da PHP versucht, 4 GB Speicher zuzuweisen, um sicherzustellen, dass der gesamte String gepuffert werden kann. Dies kann auch in anderen Sprachen als PHP passieren.

Sie sollten jedoch immer die Eingabe überprüfen (Ist sie zu lang? Enthält sie seltsamen Code?) bevor Sie sie in der Datenbank speichern.

Achtung: Für beide Typen hängt der benötigte Festplattenspeicher nur von der Länge des gespeicherten Strings und nicht von der maximalen Länge ab.
Zum Beispiel, wenn Sie das Zeichenset latin1 verwenden und den Text "Test" in VARCHAR(30), VARCHAR(100) und TINYTEXT speichern, benötigt dies immer 5 Bytes (1 Byte zur Speicherung der Zeichenlänge und 1 Byte für jedes Zeichen). Wenn Sie denselben Text in einer VARCHAR(2000)- oder einer TEXT-Spalte speichern, würde dies ebenfalls den gleichen Platz benötigen, aber in diesem Fall wären es 6 Bytes (2 Bytes zur Speicherung der Zeichenlänge und 1 Byte für jedes Zeichen).

Für weitere Informationen werfen Sie einen Blick in die Dokumentation.

Zu guter Letzt möchte ich darauf hinweisen, dass sowohl TEXT als auch VARCHAR variable Datentypen sind und daher sehr wahrscheinlich den Platz minimieren, den Sie benötigen, um die Daten zu speichern. Dies geht jedoch zulasten der Leistung. Wenn Sie bessere Leistung benötigen, müssen Sie einen festen Längentyp wie CHAR verwenden. Mehr dazu erfahren Sie hier.

108voto

Code Commander Punkte 15587

Es gibt ein wichtiges Detail, das in der obigen Antwort ausgelassen wurde.

MySQL setzt ein Limit von 65.535 Bytes für die maximale Größe jeder Reihe. Die Größe einer VARCHAR-Spalte zählt zur maximalen Reihengröße, während TEXT-Spalten davon ausgegangen wird, dass sie ihre Daten per Verweis speichern, so dass nur 9-12 Bytes benötigt werden. Das bedeutet, selbst wenn die "theoretische" maximale Größe Ihres VARCHAR-Feldes 65.535 Zeichen beträgt, werden Sie das nicht erreichen können, wenn Sie mehr als eine Spalte in Ihrer Tabelle haben.

Beachten Sie auch, dass die tatsächliche Anzahl von Bytes, die von einer VARCHAR-Spalte benötigt werden, von der Codierung der Spalte (und dem Inhalt) abhängt. MySQL zählt die maximal möglichen Bytes zur maximalen Reihengröße, also wenn Sie eine multibyte-Codierung wie utf8mb4 verwenden (was Sie fast sicher sollten), wird es noch mehr von Ihrer maximalen Reihengröße verbrauchen.

Korrektur: Unabhängig davon, wie MySQL die maximale Reihengröße berechnet, ob die Daten des VARCHAR/TEXT-Feldes tatsächlich in der Reihe gespeichert oder per Verweis gespeichert werden, hängt von Ihrem zugrunde liegenden Speicher-Engine ab. Bei InnoDB beeinflusst das Reihenformat dieses Verhalten. (Danke Bill-Karwin)

Gründe für die Verwendung von TEXT:

  • Wenn Sie einen Absatz oder mehr Text speichern möchten
  • Wenn Sie die Spalte nicht indizieren müssen
  • Wenn Sie das Reihengrößenlimit für Ihre Tabelle erreicht haben

Gründe für die Verwendung von VARCHAR:

  • Wenn Sie ein paar Wörter oder einen Satz speichern möchten
  • Wenn Sie die (gesamte) Spalte indizieren möchten
  • Wenn Sie die Spalte mit Fremdschlüssel-Einschränkungen verwenden möchten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X