Kurze Antwort: Es gibt keine praktischen, leistungsmäßigen oder speichertechnischen Unterschiede.
Lange Antwort:
Es gibt (in MySQL) im Wesentlichen keinen Unterschied zwischen VARCHAR(3000)
(oder jede andere große Grenze) und TEXT
. Ersteres wird bei 3000 abgeschnitten Zeichen Letztere werden bei 65535 abgeschnitten. Bytes . (Ich mache einen Unterschied zwischen Bytes y Zeichen weil ein Zeichen mehrere Bytes umfassen kann).
Für kleinere Grenzwerte in VARCHAR
gibt es einige Vorteile gegenüber TEXT
.
- "kleiner" bedeutet 191, 255, 512, 767 oder 3072 usw., je nach Version, Kontext und
CHARACTER SET
.
INDEXes
sind in der Größe einer Spalte, die indiziert werden kann, begrenzt. (767 oder 3072 Bytes (dies ist abhängig von der Version und den Einstellungen)
- Zwischentabellen, die durch komplexe
SELECTs
werden auf zwei verschiedene Arten behandelt: MEMORY (schneller) oder MyISAM (langsamer). Wenn es sich um "große" Spalten handelt, wird automatisch die langsamere Technik gewählt. (In Version 8.0 wird es erhebliche Änderungen geben; dieser Punkt kann sich also noch ändern).
- Im Zusammenhang mit dem vorherigen Punkt sind alle
TEXT
Datentypen (im Gegensatz zu VARCHAR
) direkt zu MyISAM springen. Das heißt, TINYTEXT
ist automatisch schlechter für generierte temporäre Tabellen als die entsprechende VARCHAR
. (Aber das führt die Diskussion in eine dritte Richtung!)
VARBINARY
ist wie VARCHAR
; BLOB
ist wie TEXT
.
- Ein Tisch mit mehreren "großen
VARCHARs
eine Grenze von 64 KB für die gesamte Tabellendefinition erreichen konnte; der Wechsel zu TEXT
ist eine einfache und praktische Lösung. (Beispiel: (42000) Zeilengröße zu groß, von einem Oracle-Dump zu einem MySQL-Dump )
Erwiderung auf andere Antworten
Die ursprüngliche Frage bezog sich auf eine Sache (welcher Datentyp zu verwenden ist); die akzeptierte Antwort bezog sich auf etwas anderes (Speicherung außerhalb des Datensatzes). Diese Antwort ist nun nicht mehr aktuell.
Als dieses Thema gestartet wurde et antwortete, gab es nur zwei "Zeilenformate" in InnoDB. Bald darauf wurden zwei weitere Formate ( DYNAMIC
y COMPRESSED
) wurden eingeführt.
Der Speicherort für TEXT
y VARCHAR()
stützt sich auf Größe , nicht auf Name des Datentyps . Für eine aktualisiert Erörterung der Speicherung großer Text-/Blobspalten im On/Off-Record-Verfahren, siehe este .
34 Stimmen
Ein bisschen alt, aber ich bin hierher gekommen, weil ich auf ein Problem gestoßen bin, das mich zum Nachdenken gebracht hat. In meinem Fall war mein Front-End-Formular auf 2.000 Zeichen begrenzt, aber die in meiner Speichermethode implizierte Kodierung kodierte internationale Zeichen als Mehrfachzeichen (die anscheinend überall zwischen 3 und 12 pro Zeichen liegen können). So werden aus meinen 2.000 plötzlich bis zu 24.000. Etwas zum Nachdenken...
3 Stimmen
Ich habe festgestellt, dass Text bei vielen gleichzeitigen Einfügungen deutlich schneller ist.
1 Stimmen
@JamesS: utf8mb4... >.<
1 Stimmen
Hier ist ein neues Thema: dba.stackexchange.com/questions/210408/
1 Stimmen
@Rick James - Die Frage, die Sie verlinkt haben, ist überhaupt nicht dieselbe Frage. Bitte beachten Sie, dass dieser Thread 400.000 Mal aufgerufen wurde, und Sie schlagen vor, ihn durch etwas mit 35 Aufrufen und Ihrer eigenen Antwort als Top-Antwort zu ersetzen? Die Frage ist nach wie vor gültig und die Antworten hier sind eine nützliche Aufzeichnung.
12 Stimmen
@RickJames erwäge, eine aktualisierte Antwort zu posten, anstatt die Frage zu schließen
3 Stimmen
@YvetteColomb - Ich habe eine Antwort hinzugefügt. Ich möchte vor allem die Angenommene Antwort loswerden, weil sie veraltet . Ich bin zu den Fragen und Antworten gekommen, weil jemand falsche Informationen zitiert hat und sagte: "754 Bewertungen, also muss es richtig sein". OK, ich habe die genehmigte Antwort auch bearbeitet. (Auch wenn sich das unpassend anfühlt.)
1 Stimmen
MySQL :: MySQL 8.0 Referenzhandbuch :: 15.10 InnoDB-Zeilenformate