TL;DR
TEXT
- feste maximale Größe von 65535 Zeichen (Sie können die maximale Größe nicht begrenzen)
- nimmt 2 +
c
Bytes Speicherplatz, wobeic
ist die Länge des gespeicherten Strings. - kann nicht (vollständig) Teil eines Indexes sein. Man müsste eine Präfixlänge angeben.
VARCHAR(M)
- variable maximale Größe von
M
Zeichen M
muss zwischen 1 und 65535 liegen- nimmt 1 +
c
Bytes (fürM
≤ 255) oder 2 +c
(für 256 ≤M
≤ 65535) Bytes Speicherplatz, wobeic
ist die Länge des gespeicherten Strings - kann Teil eines Indexes sein
Mehr Details
TEXT
hat eine feste maximale Größe von 2¹⁶-1 = 65535
Zeichen.VARCHAR
hat eine Variable maximale Größe M
bis zu M = 2¹⁶-1
.
Sie können also die Größe von TEXT
nicht auswählen aber Sie können für einen VARCHAR
.
Der andere Unterschied besteht darin, dass Sie keinen Index (außer einem Volltextindex) auf einen TEXT
setzen können Spalte.
Wenn Sie also einen Index für die Spalte haben möchten, müssen Sie VARCHAR
verwenden . Beachten Sie jedoch, dass die Länge eines Index ebenfalls begrenzt ist, wenn also Ihr VARCHAR
Spalte zu lang ist, müssen Sie nur die ersten paar Zeichen des VARCHAR
verwenden Spalte in Ihrem Index (Siehe die Dokumentation für CREATE INDEX
).
Sie möchten aber auch VARCHAR
verwenden , wenn Sie wissen, dass die maximale Länge des möglichen Eingabestrings nur M
ist , z.B. eine Telefonnummer oder einen Namen oder so etwas. Dann können Sie VARCHAR(30)
verwenden statt TINYTEXT
oder TEXT
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 möchten, länger als 65535 Zeichen ist, müssen Sie MEDIUMTEXT
wählen oder LONGTEXT
, aber Vorsicht:MEDIUMTEXT
speichert Strings bis zu 16 MB, LONGTEXT
bis zu 4GB. Wenn Sie LONGTEXT
verwenden und holen Sie sich die Daten per PHP (zumindest wenn Sie mysqli
verwenden ohne store_result
), erhalten Sie möglicherweise einen Speicherzuweisungsfehler, da PHP versucht, 4 GB Speicher zuzuweisen, um sicherzustellen, dass der gesamte String gepuffert werden kann. Dies passiert möglicherweise auch in anderen Sprachen als PHP.
Sie sollten jedoch immer Überprüfen Sie die Eingabe (Ist sie zu lang? Enthält sie seltsamen Code?) vorher Speichern in der Datenbank.
Hinweis: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.
Z.B. wenn Sie den Zeichensatz latin1 verwenden und den Text "Test" in VARCHAR(30)
speichern , VARCHAR(100)
und TINYTEXT
, benötigt es immer 5 Bytes (1 Byte zum Speichern der Länge des Strings und 1 Byte für jedes Zeichen). Wenn Sie denselben Text in einem VARCHAR(2000)
speichern oder ein TEXT
-Spalte, würde es auch den gleichen Platz benötigen, aber in diesem Fall wären es 6 Bytes (2 Bytes zum Speichern der Zeichenfolgenlänge und 1 Byte für jedes Zeichen).
Weitere Informationen finden Sie in der Dokumentation .
Abschließend möchte ich noch einen Hinweis hinzufügen, dass sowohl TEXT
und VARCHAR
sind Datentypen mit variabler Länge und minimieren daher höchstwahrscheinlich den Speicherplatz, den Sie zum Speichern der Daten benötigen. Dies geht jedoch mit einem Kompromiss für die Leistung einher. Wenn Sie eine bessere Leistung benötigen, müssen Sie einen Typ mit fester Länge wie CHAR
verwenden . Mehr darüber können Sie hier
lesen .