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
?
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
?
TEXT
c
Bytes auf der Festplatte, wobei c
die Länge des gespeicherten Strings ist.VARCHAR(M)
M
ZeichenM
muss zwischen 1 und 65535 liegenc
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 istTEXT
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.
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
:
Gründe für die Verwendung von VARCHAR
:
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.