Wenn wir eine Tabelle in Mysql mit einer VARCHAR
-Spalte erstellen, müssen wir die Länge dafür festlegen. Aber für den Typ "TEXT" müssen wir die Länge nicht angeben.
Was sind die Unterschiede zwischen VARCHAR
und TEXT
?
TEXT
c
Bytes Speicherplatz, wobei c
die Länge der gespeicherten Zeichenfolge ist.VARCHAR(M)
M
Zeichenc
Bytes (für M
≤ 255) oder 2 + c
(für 256 ≤ M
≤ 65535) Bytes Speicherplatz, wobei c
die Länge der gespeicherten Zeichenfolge istTEXT" hat eine feste 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, wohl aber die von VARCHAR
.
Der andere Unterschied ist, dass Sie keinen Index (außer einem Volltextindex) auf eine TEXT
-Spalte setzen können.
Wenn Sie also einen Index für die Spalte haben wollen, müssen Sie VARCHAR
verwenden. Beachten Sie aber, dass die Länge eines Indexes ebenfalls begrenzt ist. Wenn also 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
).
Sie wollen aber auch VARCHAR
verwenden, wenn Sie wissen, dass die maximale Länge der möglichen Eingabezeichenkette nur M
ist, z.B. eine Telefonnummer oder ein Name oder etwas Ähnliches. Dann können Sie VARCHAR(30)
anstelle von TINYTEXT
oder TEXT
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 :)
Bearbeiten: Wenn der Text, den Sie in der Datenbank speichern wollen, länger als 65535 Zeichen ist, müssen Sie MEDIUMTEXT
oder LONGTEXT
wählen, aber seien Sie vorsichtig: MEDIUMTEXT
speichert Zeichenketten 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 Fehler bei der Speicherzuweisung, da PHP versucht, 4 GB Speicher zuzuweisen, um sicherzustellen, dass der gesamte String gepuffert werden kann. Dies kann auch in anderen Sprachen als PHP vorkommen.
Sie sollten jedoch immer die Eingabe überprüfen (Ist sie zu lang? Enthält sie seltsamen Code?) bevor Sie sie in der Datenbank speichern.
Beachten Sie: Bei beiden Typen hängt der benötigte Speicherplatz nur von der Länge des gespeicherten Strings ab und nicht von der maximalen Länge.
*Wenn Sie z.B. den Zeichensatz latin1 verwenden und den Text "Test" in VARCHAR(30)
, VARCHAR(100)
und TINYTEXT
speichern, werden immer 5 Byte benötigt (1 Byte zum Speichern der Länge der Zeichenkette und 1 Byte für jedes Zeichen). Wenn Sie denselben Text in einer VARCHAR(2000)
- oder TEXT
-Spalte speichern, wird derselbe Platz benötigt, aber in diesem Fall sind es 6 Byte (2 Byte für die Länge der Zeichenfolge und 1 Byte für jedes Zeichen).
Weitere Informationen finden Sie in der Dokumentation.
Abschließend möchte ich noch anmerken, dass sowohl TEXT
als auch VARCHAR
Datentypen mit variabler Länge sind und daher höchstwahrscheinlich den für die Speicherung der Daten benötigten Platz minimieren. Dies geht jedoch zu Lasten der Leistung. Wenn Sie eine bessere Leistung benötigen, müssen Sie einen Datentyp mit fester Länge wie CHAR
verwenden. Mehr darüber können Sie hier lesen.