899 Stimmen

MySQL: Großer VARCHAR vs. TEXT?

Ich habe eine Nachrichtentabelle in MySQL, die Nachrichten zwischen Benutzern aufzeichnet. Abgesehen von den typischen IDs und Nachrichtentypen (alles Integer-Typen) muss ich den eigentlichen Nachrichtentext entweder als VARCHAR oder TEXT speichern. Ich setze ein Front-End-Limit von 3000 Zeichen, was bedeutet, dass die Nachrichten nie in die Datenbank eingefügt werden, wenn sie länger sind als diese.

Gibt es einen Grund für die Verwendung von VARCHAR(3000) oder TEXT? Es gibt etwas über nur VARCHAR(3000) zu schreiben, die etwas kontra-intuitiv fühlt. Ich habe durch andere ähnliche Beiträge auf Stack Overflow gewesen, aber wäre gut, Ansichten spezifisch für diese Art von gemeinsamen Nachricht speichern zu erhalten.

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... >.<

844voto

MindStalker Punkte 14435
  • TEXT y BLOB Mai indem sie außerhalb der Tabelle gespeichert werden, wobei die Tabelle lediglich einen Zeiger auf den Ort der tatsächlichen Speicherung enthält. Wo er gespeichert wird, hängt von vielen Dingen ab, wie Datengröße, Spaltengröße, row_format und MySQL-Version.

  • VARCHAR wird inline mit der Tabelle gespeichert. VARCHAR ist schneller, wenn die Größe vernünftig ist. Der Kompromiss, welcher schneller ist, hängt von Ihren Daten und Ihrer Hardware ab; Sie sollten ein reales Szenario mit Ihren Daten testen.

522voto

Michael J. Calkins Punkte 31024

Können Sie vorhersagen, wie lang die Benutzereingabe sein wird?

VARCHAR(X)

Maximale Länge: variabel, bis zu 65.535 Bytes (64KB)
Fall: Benutzername, E-Mail, Land, Betreff, Passwort


TEXT

Maximale Länge: 65.535 Bytes (64KB)
Fall: Nachrichten, E-Mails, Kommentare, formatierter Text, HTML, Code, Bilder, Links


MEDIUMTEXT

Maximale Länge: 16.777.215 Bytes (16MB)
Fall: große json-Körper, kurze bis mittellange Bücher, csv-Strings


LONGTEXT

Maximale Länge: 4.294.967.29 Bytes (4GB)
Fall: lehrbücher, programme, jahrelange protokolldateien, harry potter und der feuerkelch, wissenschaftliche forschungsprotokolle

Weitere Informationen finden Sie unter diese Frage .

224voto

James Punkte 3802

Nur um die beste Praxis zu verdeutlichen:

  1. Nachrichten im Textformat sollten fast immer als TEXT gespeichert werden (sie werden dann beliebig lang)

  2. String-Attribute sollten als VARCHAR gespeichert werden (der Ziel-Benutzername, der Betreff, etc...).

Ich verstehe, dass Sie ein Front-End-Limit haben, was großartig ist, bis es nicht mehr ist. *grins* Der Trick besteht darin, die DB als getrennt von den Anwendungen zu betrachten, die sich mit ihr verbinden. Nur weil eine Anwendung die Daten begrenzt, heißt das nicht, dass die Daten von sich aus begrenzt sind.

Was hat es mit den Nachrichten selbst auf sich, dass sie niemals mehr als 3000 Zeichen umfassen dürfen? Wenn es sich nur um eine willkürliche Anwendungsbeschränkung handelt (z. B. für ein Textfeld oder ähnliches), verwenden Sie eine TEXT Feld auf der Datenebene.

39voto

Rick James Punkte 120626

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 .

34voto

Michael Anderson Punkte 65535

Haftungsausschluss: Ich bin kein MySQL-Experte ... aber das ist mein Verständnis der Probleme.

Ich glaube, TEXT wird außerhalb der Mysql-Zeile gespeichert, während ich glaube, dass VARCHAR als Teil der Zeile gespeichert wird. Es gibt eine maximale Zeilenlänge für Mysql-Zeilen so können Sie begrenzen, wie viele andere Daten Sie in einer Zeile speichern können, indem Sie VARCHAR verwenden.

Da VARCHAR einen Teil der Zeile bildet, vermute ich, dass Abfragen, die dieses Feld betrachten, etwas schneller sind als solche, die einen TEXT-Block verwenden.

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