HOWTO · MySQL

Unterschied zwischen VARCHAR und TEXT in MySQL

Dieses Tutorial zeigt den Unterschied zwischen VARCHAR und TEXT in der MySQL-Datenbank.

Auf dieser Seite

Wähle VARCHAR, wenn sich für einen Wert eine sinnvolle Höchstlänge festlegen lässt und die Spalte häufig in üblichen Abfragen verwendet wird. Wähle TEXT für längere Inhalte oder wenn sich deren praktische Größe weniger gut vorhersagen lässt. Welche Wahl passt, hängt von den erwarteten Daten, der von der Anwendung durchzusetzenden Grenze und der Verwendung der Spalte in Abfragen ab; keiner der beiden Typen ist grundsätzlich schneller oder besser.

Was VARCHAR und TEXT speichern

In MySQL speichern sowohl VARCHAR als auch TEXT Zeichendaten, sie drücken jedoch unterschiedliche Erwartungen an das Schema aus. Mit VARCHAR(n) wird eine Länge für die Spalte festgelegt. Das eignet sich daher oft für Werte mit einer bekannten Obergrenze, etwa einen Anzeigenamen oder eine kurze Bezeichnung. Eine Spalte vom Typ TEXT ist für längere Texte gedacht, zum Beispiel einen Nutzerkommentar oder einen Artikeltext, wenn eine kurze festgelegte Höchstlänge die Daten nicht gut beschreiben würde.

Die Typnamen legen nicht fest, welche Validierungsregeln für deine Anwendung gelten. Entscheide vor dem Einfügen, welche Werte zulässig sind, und richte die Spaltenwahl nach diesen Regeln aus. Eine Telefonnummer kann beispielsweise kurz sein, sollte aber nicht automatisch als Zahl gespeichert werden: Wird sie als Text behandelt, lässt sie sich mit VARCHAR und einer passenden, von der Anwendung festgelegten Grenze darstellen.

Längenbegrenzungen und Speicherkosten

Die Zahl in VARCHAR(n) bezeichnet eine festgelegte Zeichenbegrenzung; ein gespeicherter Wert kann kürzer sein. Der tatsächliche Speicherbedarf und die zulässige Größe hängen vom Schema und den geltenden Begrenzungen von MySQL ab. Auch Zeichensatz und Zeilendefinition spielen eine Rolle. Da diese Angaben je nach Version von MySQL, Zeichensatz und Tabellendefinition variieren, solltest du die Dokumentation für deine Bereitstellung heranziehen, statt dich auf eine allgemeingültige Berechnung der Bytekosten oder der maximalen Größe zu verlassen.

Wähle einen Typ nicht allein aufgrund der Behauptung, dass er immer weniger Speicher benötigt. Berücksichtige die erwartete Länge der Werte, die festgelegte Grenze und den Aufbau der gesamten Tabelle. TEXT ist für längere Inhalte vorgesehen, während VARCHAR einen begrenzten Wert direkt im Schema kenntlich macht.

Überlegungen zu Indizes und Abfragen

Der Indexbedarf sollte Teil des Entwurfs sein. Überlege, nach welchen Spalten deine Anwendung filtert, sortiert oder Verknüpfungen ausführt, und prüfe, welche Indexdefinition zur eingesetzten Version von MySQL und zum jeweiligen Schema passt. TEXT ist nicht grundsätzlich ungeeignet für Indizes; die verfügbaren Möglichkeiten und Einschränkungen können jedoch von diesen Details abhängen. Gehe nicht davon aus, dass einer der beiden Typen eine bestimmte Abfragegeschwindigkeit garantiert. Wenn die Leistung wichtig ist, miss repräsentative Abfragen in deiner eigenen Umgebung.

Den passenden Typ für deine Daten wählen

Beginne mit der Bedeutung des Werts und seinem erwarteten Wertebereich. Eine begrenzte Bezeichnung, E-Mail-Adresse oder ein Anzeigename passt oft zu VARCHAR, wenn sich eine sinnvolle Grenze festlegen lässt. Längere Nutzerkommentare oder Artikeltexte können zu TEXT passen. Das sind Beispiele, keine festen Regeln: In einer Anwendung können andere Begrenzungen oder Abfragemuster gelten.

Berücksichtige anschließend, wie die Spalte verwendet wird. Wird häufig danach gesucht oder sortiert, beziehe dieses Zugriffsmuster in die Prüfung von Schema und Indizes ein. Gibt es für den Wert eine klare Produktgrenze, validiere ihn vor dem Einfügen in der Anwendung und berücksichtige diese Grenze beim Spaltenentwurf. So wird das erwartete Verhalten ausdrücklich festgelegt, ohne sich auf nicht näher bestimmtes Serververhalten bei zu langen Eingaben zu verlassen.

Beispielschema und Umgang mit Längenbegrenzungen

Eine kleine Profiltabelle könnte für begrenzte Felder VARCHAR und für eine optionale Biografie TEXT verwenden. Das Inline-Schema CREATE TABLE profile (display_name VARCHAR(80), phone VARCHAR(32), biography TEXT); veranschaulicht diese Rollen. Wähle Grenzen, die zu deinen Anforderungen passen, und prüfe die Indexwahl für deine Bereitstellung.

Bei einer von der Anwendung verwalteten Feldbegrenzung kann Anwendungscode ein Ergebnis außerhalb der Grenze zurückweisen, bevor der Wert an die Datenbank übergeben wird. Das folgende Python-Beispiel gibt lediglich zurück, ob ein Wert einer festgelegten Regel zur Zeichenzahl entspricht; es weist selbst nichts zurück. Der gezeigte Wert hat 12 Zeichen und liegt damit innerhalb der Grenze von 80. Das Beispiel zeigt weder, wie sich MySQL beim Einfügen verhält, noch ersetzt es serverseitige Einschränkungen.

Führe dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

values = ["Ada Lovelace", "x" * 81]
max_characters = 80
for value in values:
    print(len(value) <= max_characters)
True
False