- 1 1. Einführung: Warum Sie die MySQL‑Datentypen‑Liste verstehen sollten
- 2 2. Was ist ein Datentyp und warum ist das „Wählen des richtigen Typs“ wichtig?
- 3 3. MySQL-Datentyp-Kategorien (Übersichtsliste)
- 4 3.1 Numerische Typen
- 5 3.2 Datums‑ und Zeittypen
- 6 3.3 Zeichen‑/Binärtypen
- 7 3.4 JSON‑Typ
- 8 3.5 Räumliche Typen
- 9 4. Wie man jeden Datentyp auswählt und verwendet (Entscheidungspunkte)
- 10 4.1 Wie man numerische Typen auswählt
- 11 4.2 Wie man Datums‑ und Zeittypen auswählt
- 12 4.3 Wie man String‑Typen auswählt
- 13 4.4 Wie man den JSON‑Typ auswählt
- 14 4.5 Wie man ENUM‑/SET‑Typen auswählt
- 15 4.6 Wie man Binary‑/BLOB‑Typen auswählt
- 16 5. Praxis: Wie man die „Daten‑Typ‑Referenzliste“ beim Entwerfen von Tabellen verwendet
- 17 5.1 Schritt 1: Klären Sie den „Zweck“ und die „Natur“ der Spalte
- 18 5.2 Schritt 2: Schätzen des erforderlichen Bereichs und Formats
- 19 5.3 Schritt 3: Berücksichtige Datenvolumen und Performance
- 20 5.4 Schritt 4: Validiere Typen mit Beispieldaten
- 21 5.5 Schritt 5: Berücksichtige Skalierbarkeit und Wartbarkeit
- 22 5.6 Schritt 6: CREATE TABLE-Beispiel (praktisches Sample)
- 23 6. Häufige Fehler und wie man sie vermeidet
- 24 6.1 Verwendung übermäßig großer Datentypen
- 25 6.2 Verwendung von FLOAT/DOUBLE für Dezimalwerte (Präzisionsprobleme)
- 26 6.3 Zu große VARCHAR‑Spalten
- 27 6.4 Übermäßiger Einsatz von TEXT‑Typen
- 28 6.5 Auswahl von Datum/Uhrzeit‑Typen ohne deren Eigenschaften zu verstehen
- 29 6.6 Verwendung von ENUM / SET zu lässig
- 30 6.7 Zu viel in JSON packen, weil es praktisch ist
- 31 6.8 Unterschätzung der Kosten von Typänderungen
- 32 7. Zusammenfassung
- 33 8. FAQ
- 33.1 Q1. Soll ich INT oder BIGINT verwenden?
- 33.2 Q2. Soll ich VARCHAR oder TEXT verwenden?
- 33.3 Q3. Ist es in Ordnung, Geld als DOUBLE zu speichern?
- 33.4 Q4. Ich verstehe den Unterschied zwischen DATETIME und TIMESTAMP nicht. Wie soll ich wählen?
- 33.5 Q5. Ist die Verwendung von ENUM sicher?
- 33.6 Q6. Kann ich vorerst einfach JSON verwenden?
- 33.7 Q7. Wie bestimme ich die maximale Länge für VARCHAR?
- 33.8 Q8. Wenn ich den falschen Typ gewählt habe, kann ich ihn später ändern?
1. Einführung: Warum Sie die MySQL‑Datentypen‑Liste verstehen sollten
Wenn Sie Tabellen entwerfen oder Anwendungen mit MySQL integrieren, ist eine der häufigsten Fragen: „Welchen Datentyp soll ich für diese Spalte verwenden?“
Soll es INT sein? Brauchen Sie wirklich BIGINT? Reicht VARCHAR für Zeichenketten aus, oder ist TEXT besser? Diese Entscheidungen mögen klein erscheinen, bilden aber das Fundament, das Ihr System später beeinflusst.
Wenn Sie die Wahl der Datentypen unterschätzen, stoßen Sie häufig auf Probleme wie die folgenden:
- Wenn Ihre Daten schneller als erwartet wachsen, verschwenden Sie Speicherplatz
- Indizes blähen sich auf und die Abfrage‑Performance verschlechtert sich allmählich
- Werte außerhalb des zulässigen Bereichs oder Überläufe verursachen unerwartete Bugs oder Ausnahmen
- Sie sind gezwungen, Spaltentypen später zu ändern, was eine groß angelegte Migration auslöst
Mit anderen Worten, ein systematisches Verständnis der MySQL‑Datentypen und die Wahl des richtigen Typs für jeden Anwendungsfall ist der schnellste Weg, sowohl Leistung als auch Wartbarkeit zu verbessern.
Diese Seite richtet sich hauptsächlich an Leser wie:
- Ingenieure, die kurz davor stehen, ernsthafte Systementwicklung mit MySQL zu starten
- Backend‑/Infrastruktur‑orientierte Entwickler, die bestehende Tabellendesigns überprüfen wollen
- Web‑Entwickler und Programmierer, die „empfohlene Typen“ nach Anwendungsfall suchen
Wir beginnen damit, die wichtigsten MySQL‑Datentypen als kategorisierte „Liste“ zu ordnen. Anschließend erklären wir die Schlüsseltypen — numerisch, Zeichenkette, Datum/Uhrzeit, JSON, ENUM/SET — und gehen auf deren Eigenschaften, typische Anwendungsfälle und Auswahl‑Tipps ein. Zum Schluss fassen wir häufige Design‑Fehler zusammen und zeigen, wie man sie vermeidet, inklusive FAQ.
Dies ist nicht nur eine „Begriffs‑Liste“. Es ist als Entscheidungs‑Leitfaden strukturiert, damit Sie beim Entwerfen von Tabellen in realen Projekten nicht stecken bleiben. Im nächsten Abschnitt tauchen wir ein, wie man über Datentypen nachdenkt und die kategorisierte Liste prüft.
2. Was ist ein Datentyp und warum ist das „Wählen des richtigen Typs“ wichtig?
In einer Datenbank ist ein „Datentyp“ eine Regel, die definiert, welche Art von Werten eine Spalte speichern kann.
MySQL bietet viele Datentypen — Integer, Dezimalzahlen, Zeichenketten, Datumsangaben, Binärdaten, JSON und mehr — so dass Sie je nach Zweck den passenden auswählen müssen.
Die Rolle von Datentypen
Ein Datentyp ist nicht nur eine „Format‑Kategorie“. Er erfüllt gleichzeitig mehrere Funktionen:
- Beschränkt die Art der Daten (numerisch vs. Zeichenkette, Boolean usw.)
- Definiert den zulässigen Wertebereich und die Anzahl der Stellen
- Bestimmt den benötigten Speicher (Speichergröße)
- Beeinflusst Indexstrukturen und Such‑Performance
- Wirkt sich auf implizite Konvertierungen und Vergleichsregeln aus (z. B. String‑Collation)
Kurz gesagt, Datentypen sind nicht bloß „Container“ — sie sind grundlegende Design‑Entscheidungen, die den gesamten Lebenszyklus der Datenverwaltung beeinflussen.
Was passiert, wenn Sie den falschen Typ wählen?
Wenn Sie den falschen Datentyp wählen, treten in der Praxis häufig folgende Probleme auf:
• Speicher verschwenden
Zum Beispiel, wenn BIGINT (8 Byte) ausreicht, Sie aber irrtümlich DECIMAL oder LONGTEXT verwenden, verbrauchen Sie viel mehr Festplattenspeicher als nötig.
• Langsamere Abfragen
Wenn Sie übermäßig LIKE‑Suche auf riesigen TEXT‑Spalten einsetzen oder Indizes aufblähen, weil Sie zu große numerische Typen gewählt haben, verlangsamt sich die SQL‑Ausführung.
• Inkonsistente Werte oder Überlauf
Sie können Werte speichern, die nicht in INT passen, was zu unerwarteten negativen Zahlen, Rundungen oder anderen Problemen führt.
• Aufwändige Tabellenänderungen
Besonders bei großen Tabellen kann das Ändern von Typen mit ALTER TABLE zu:
- langen Sperrzeiten
- Service‑Auswirkungen
- Daten‑Migrationsaufwand und weiteren Risiken führen.
Schlüssel‑Kategorien, die Sie von Anfang an verstehen sollten
MySQL‑Datentypen lassen sich grob in folgende Kategorien einteilen:
- Numerische Typen (Integer, Dezimalzahlen)
- Zeichenketten‑Typen
- Datum‑ und Zeit‑Typen
- Binär‑Typen
- JSON‑Typ
- ENUM / SET‑Typen
- Räumliche Datentypen
Each category has different trade-offs—strengths/weaknesses, “light vs. heavy,” and “easy vs. hard to search.” That’s why you need the optimal type selection for each use case.
3. MySQL-Datentyp-Kategorien (Übersichtsliste)
In diesem Abschnitt fassen wir die in MySQL verfügbaren Datentypen als kategorisierte Übersichtsliste zusammen. In der Praxis sind die ersten Dinge, die Sie klären möchten, „Welche Typen gibt es?“ und „Welchen sollte ich verwenden?“
Hier zeigen wir also deutlich Anwendungsfälle, zentrale Merkmale und repräsentative Typnamen, und erklären anschließend jede Kategorie in den folgenden Abschnitten genauer.
3.1 Numerische Typen
Numerische Typen bilden die Grundlage für alle numerischen Berechnungen, einschließlich Ganzzahlen, Dezimalzahlen und Fließkommawerte.
Diese Kategorie wird am häufigsten für IDs, Mengen, Preise, Flag‑Prüfungen und viele andere Zwecke verwendet.
Ganzzahltypen
| Type | Bytes | Characteristics / Use Cases |
|---|---|---|
| TINYINT | 1B | -128 to 127. Ideal for flags and small numbers |
| SMALLINT | 2B | -32,768 to 32,767. Lightweight integers |
| MEDIUMINT | 3B | Integer type that can handle a mid-range |
| INT / INTEGER | 4B | The most common integer type. Often used for IDs |
| BIGINT | 8B | Large values (order numbers, log counters, etc.) |
Hinweise
- Das Hinzufügen von
UNSIGNEDverdoppelt den positiven Wertebereich. INTwird in vielen Fällen verwendet, aber die lockere Verwendung vonBIGINTkann Indizes schwerer machen.
Dezimal‑/Fließkomma‑Typen
| Type | Characteristics |
|---|---|
| DECIMAL | Best for amounts like currency where errors are unacceptable |
| NUMERIC | Synonymous with DECIMAL |
| FLOAT | Memory-efficient, but may introduce rounding errors |
| DOUBLE | Higher precision than FLOAT, but errors can still occur |
Hinweise
- Für Geld ist
DECIMALdie einzige sinnvolle Wahl. Fließkomma‑Typen (FLOAT/DOUBLE) können Fehler einführen. - In Fällen mit vielen Berechnungen wird
DOUBLEmanchmal wegen Geschwindigkeit/Genauigkeit‑Kompromissen gewählt.
Weitere numerische Typen
| Type | Characteristics |
|---|---|
| BIT | Bit-level flag management (0/1) |
| BOOL / BOOLEAN | Actually an alias for TINYINT(1) |
3.2 Datums‑ und Zeittypen
Der Umgang mit Datum/Zeit wird in der Anwendungsentwicklung sehr häufig verwendet.
Je nach Zweck unterscheiden sich Faktoren wie „Zeitzonenverhalten“, „automatische Updates“ und „Präzision bis zur Sekunde“, sodass die Wahl des richtigen Typs wichtig ist.
| Type | Characteristics / Use Cases |
|---|---|
| DATE | Date only (YYYY-MM-DD) |
| TIME | Time only (HH:MM:SS) |
| DATETIME | Date + time. Not affected by time zones |
| TIMESTAMP | Date + time. Stored as UNIX time; affected by time zones; can auto-update |
| YEAR | Stores the year only (YYYY) |
Hinweise
- Wenn Sie das „updated at“ automatisch verwalten möchten, ist
TIMESTAMPpraktisch. - Für „Logs“ oder „Historie“, bei denen Sie genaue Zeitstempel speichern wollen, wird
DATETIMEhäufig verwendet.
3.3 Zeichen‑/Binärtypen
Benutzernamen, E‑Mails, Passwörter, Beschreibungen – Zeichenketten sind oft der komplexeste Bereich beim Tabellendesign.
Festlänge‑Zeichenketten
| Type | Characteristics |
|---|---|
| CHAR(n) | Always reserves space for exactly n characters. Suitable for fixed-length data (e.g., country codes) |
Variable‑Länge‑Zeichenketten
| Type | Characteristics |
|---|---|
| VARCHAR(n) | The most common string type. Best for data with varying length |
Großer Text (TEXT‑Familie)
| Type | Characteristics |
|---|---|
| TINYTEXT | Up to 255 characters |
| TEXT | Strings up to 64KB |
| MEDIUMTEXT | Up to 16MB |
| LONGTEXT | Up to 4GB |
Hinweise
- Verwenden Sie
TEXT, wenn Sie sehr große Zeichenketten wie Artikeltexte oder lange Beschreibungen speichern müssen. - Seien Sie vorsichtig bei der Such‑ und Indexgestaltung.
Binärdaten (BINARY / BLOB)
| Type | Characteristics |
|---|---|
| BINARY / VARBINARY | Fixed-length / variable-length binary data |
| BLOB / MEDIUMBLOB / LONGBLOB | Large binary data such as images and files |
※ Im Allgemeinen werden große Dateien nicht in der Datenbank gespeichert; ein gängiges Design ist, sie stattdessen in externem Speicher abzulegen.
ENUM / SET‑Typen (Aufzählungen)
| Type | Characteristics |
|---|---|
| ENUM | Select exactly one value from a predefined set of strings |
| SET | An enumeration type that allows selecting multiple values |
Hinweise
- Wenn Sie die Typdefinition später ändern müssen, wird die Wartung aufwändig.
- Es kann für klein‑skalige, statische Kandidaten effektiv sein.
3.4 JSON‑Typ
| Type | Characteristics |
|---|---|
| JSON | Stores structured data. Officially supported since MySQL 5.7 |
- Sie erhalten NoSQL‑ähnliche Flexibilität und können dennoch JSON‑spezifische Funktionen nutzen.
- Allerdings wird nicht empfohlen, häufig gesuchte Daten in JSON zu verpacken. Wenn sie normalisiert werden können, sollten sie als strukturierte Tabellen modelliert werden.
3.5 Räumliche Typen
| Type | Characteristics |
|---|---|
| GEOMETRY | Base type for spatial data |
| POINT, LINESTRING, POLYGON | Coordinates, lines, areas, and more |
In typischen Web‑Anwendungen werden sie selten verwendet, aber sie sind wichtig für Karten‑Apps und GPS‑Integrationen.
4. Wie man jeden Datentyp auswählt und verwendet (Entscheidungspunkte)
In diesem Abschnitt gehen wir tiefer auf die oben vorgestellten Kategorien ein und konzentrieren uns darauf, „wie man in realen Szenarien auswählt“.
Nur die Namen zu kennen reicht nicht – die Auswahl des am besten passenden Datentyps hat erhebliche Auswirkungen auf Wartbarkeit, Leistung und zukünftige Skalierbarkeit.
4.1 Wie man numerische Typen auswählt
Kriterien zur Auswahl von Ganzzahltypen
Bei der Auswahl von Ganzzahltypen konzentrieren Sie sich auf diese drei Punkte:
1. Verstehen Sie den maximal erforderlichen Wertebereich
- Kleine Zähler →
TINYINT - Produktmengen / Flags →
SMALLINT/INT - Groß‑Skala‑IDs oder Logs →
BIGINT
Einige Projekte verwenden BIGINT zu häufig für Primärschlüssel, was leicht zu größeren Indexgrößen führen und die Leistung negativ beeinflussen kann.
2. Berücksichtigen Sie aktiv UNSIGNED
If you only handle positive values (e.g., numeric IDs, inventory counts)
→ using UNSIGNED doubles the range and may allow you to use a smaller type.
3. Für Geld‑ oder Präzisionskritische Werte, DECIMAL verwenden
For values where “errors are not acceptable,” avoid FLOAT/DOUBLE and always use DECIMAL.
4.2 Wie man Datums‑ und Zeittypen auswählt
The appropriate type depends on your use case.
Unterschiede zwischen DATETIME und TIMESTAMP
| Item | DATETIME | TIMESTAMP |
|---|---|---|
| Time zone | Not affected | Affected (converted) |
| Storage format | A “string-like” date/time | Stored as UNIX time |
| Auto update | Manual | Can auto-update (e.g., DEFAULT CURRENT_TIMESTAMP) |
| Range | Year 1000 to 9999 | Year 1970 to 2038 |
Allgemeine Regeln zur Auswahl
- Anwendungsprotokolle oder Ereignisdaten →
DATETIME(Vermeidung von Zeitzonenkonvertierungseffekten) - Wenn Sie aktualisierte Zeitstempel automatisch aufzeichnen möchten →
TIMESTAMP(praktisches Auto‑Update‑Verhalten)
Wo YEAR nützlich ist
- Fiskaljahr‑Kategorien, Erscheinungsjahre, Gründungsjahre usw. → Kompakt verwalten (1 Byte)
4.3 Wie man String‑Typen auswählt
Wie man zwischen CHAR und VARCHAR entscheidet
Wann Sie CHAR verwenden sollten
- Länge ist immer konstant: Präfektur‑Codes, Ländercodes, feste Identifikatoren usw.
- Daten, die schnellen Zugriff benötigen und selten aktualisiert werden
Wann Sie VARCHAR verwenden sollten
- Länge variiert: Namen, E‑Mail‑Adressen, Titel usw.
- Die beste Standardwahl in den meisten Situationen
Sollten Sie TEXT verwenden?
Vorteile von TEXT
- Unterstützt großen Text (Beschreibungen, Artikeltexte usw.)
Vorsichtsmaßnahmen bei TEXT
- Indexierung ist eingeschränkt (Präfix‑Indizes sind erforderlich)
- Die Leistung kann bei Verwendung in JOINs oder WHERE‑Klauseln abnehmen
- Suche und Sortierung können aufwendig sein
Empfehlung:
Verwenden Sie TEXT für „große Zeichenketten“ wie Inhalte oder Notizen,
und nutzen Sie VARCHAR so weit wie möglich für alles andere.

4.4 Wie man den JSON‑Typ auswählt
The JSON type is very useful, but you need to use it “correctly.”
Wenn JSON gut funktioniert
- Flexible Einstellungen oder Daten mit variabler Feldanzahl
- Eingeschränkte Lookup‑Anwendungsfälle oder wenn die Anwendung es erweitert/parst
- Speicherung leichter Daten, die keine Master‑Tabelle benötigen
Wenn JSON schlecht passt
- Daten, die Sie häufig durchsuchen
- Daten, die für gefilterte Suchen, Aggregationen oder JOINs verwendet werden
- Strukturierte Daten, die normalisiert werden sollten
Daumenregel:
Daten, die Sie durchsuchen müssen, sollten normalisiert und als Struktur behandelt werden.
Vergessen Sie nicht, dass JSON „flexibel, aber schwach für die Suche“ ist.
4.5 Wie man ENUM‑/SET‑Typen auswählt
Wann ENUM geeignet ist
- Zustände sind fest: z. B. Status (
draft/published/archived) - Eine kleine Menge an Optionen, die selten ändern
Vorsichtsmaßnahmen für ENUM
- Hinzufügen oder Ändern von Werten erfordert
ALTER TABLE - Risiko, die Konsistenz mit den Definitionen auf Anwendungsseite zu verlieren
Wann SET geeignet ist
- Kleindaten, die Mehrfachauswahl erfordern (z. B. verfügbare Wochentage oder wenn es nur wenige Tag‑Optionen gibt)
Vorsichtsmaßnahmen für SET
- Kombinationen von Werten können komplex werden
- Die Verwaltung von Mehrwert‑Zuständen kann schwierig werden
4.6 Wie man Binary‑/BLOB‑Typen auswählt
BINARY / VARBINARY
- Tokens, IDs, Hash‑Werte usw.
- Fest‑längige Binärdaten (z. B. 16‑Byte‑UUIDs)
Typische Anwendungsfälle für BLOB‑Typen
- Kleine Dateien, Miniatur‑Bilder, verschlüsselte Daten
Aber beachten Sie
- Das Speichern großer Dateien in der Datenbank macht Backups schwerer
- Lese‑/Schreib‑Last steigt ebenfalls → In realen Systemen wird externer Speicher + Pfad‑Management empfohlen
5. Praxis: Wie man die „Daten‑Typ‑Referenzliste“ beim Entwerfen von Tabellen verwendet
In diesem Abschnitt erklären wir wie man die MySQL‑Datentyp‑Liste in einem praktischen Workflow beim Entwerfen von Tabellen verwendet. Anstatt nur Typen auswendig zu lernen, führt das Organisieren von „warum Sie diesen Typ wählen“ durch Logik und Schritte zu einer qualitativ hochwertigeren Datenbank‑Design.
5.1 Schritt 1: Klären Sie den „Zweck“ und die „Natur“ der Spalte
First, clearly define what will be stored in the column.
Checkliste
- Ist es numerisch, String, Datum oder eine Flagge?
- Ist es variabler Länge oder fester Länge?
- Was ist der maximale Wert oder die maximale Länge?
- Sollte NULL erlaubt sein?
- Wird es in Zukunft wahrscheinlich wachsen?
Wenn du hier mit vagen Annahmen fortfährst, wird die Typauswahl später unnötig kompliziert.
5.2 Schritt 2: Schätzen des erforderlichen Bereichs und Formats
Als Nächstes schätze die oberen/unteren Grenzen, Zeichenlänge und erforderliche Präzision der Werte, die du speichern wirst.
Beispiel: ID-Spalte
- Wird die maximale Anzahl von Datensätzen Zehn- oder Hundertmillionen erreichen? → Das hilft dir zu bestimmen, ob
INTausreicht oder obBIGINTnotwendig ist.
Beispiel: Produktname
- Durchschnittlich 15–25 Zeichen, Maximum um die 50? →
VARCHAR(50)ist ausreichend.TEXTist unnötig.
Beispiel: Preis
- Ist Präzision erforderlich? → Du solltest etwas wie
DECIMAL(10,2)wählen.
5.3 Schritt 3: Berücksichtige Datenvolumen und Performance
Die Auswahl von MySQL-Datentypen beeinflusst die Performance direkt.
Wichtige Überlegungen
- Zu große Typen → verbrauchen Speicher und machen Indizes schwerer
TEXT/BLOB→ verschlechtern die SuchperformanceJSON→ flexibel, aber schwach für SuchenTIMESTAMP→ effizient für automatische Updates und Vergleiche
Insbesondere sollten Spalten mit Indizes den leichtesten möglichen Datentyp verwenden.
5.4 Schritt 4: Validiere Typen mit Beispieldaten
Nach dem Entwurf der Tabelle füge Dutzende bis Hunderte von Zeilen Testdaten ein und überprüfe das Verhalten.
Was zu überprüfen ist
- Gibt es unbeabsichtigte Rundungs- oder Kürzungsprobleme?
- Ist
VARCHARausreichend, oder sollte esTEXTsein? - Verhalten sich Datums-/Zeitsortierung und -suche wie erwartet?
- JSON-Lese-/Schreibperformance
Testen mit realistischen Daten reduziert „theoretische Fehleinschätzungen“.
5.5 Schritt 5: Berücksichtige Skalierbarkeit und Wartbarkeit
In der abschließenden Phase des Tabellentwurfs prüfe, ob zukünftige Änderungen einfach sein werden.
Beispiele für schwere Typänderungen
ENUM(erfordertALTER TABLEbeim Hinzufügen von Werten)TEXT→VARCHAR(Erweiterung ist einfach, Verkleinerung riskant)FLOAT→DECIMAL(kann Semantik ändern)
Wähle Typen, indem du beurteilst, ob zukünftige Erweiterung wahrscheinlich ist.
5.6 Schritt 6: CREATE TABLE-Beispiel (praktisches Sample)
Unten ist ein Beispieltabelle, die gängige Standards für die Datentypauswahl in einer typischen Web-Anwendung widerspiegelt.
CREATE TABLE products (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
stock INT UNSIGNED NOT NULL DEFAULT 0,
status ENUM('draft', 'published', 'archived') NOT NULL DEFAULT 'draft',
description TEXT,
created_at DATETIME NOT NULL,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Wichtige Punkte in diesem Beispiel
- id : Verwendet
BIGINT UNSIGNEDunter Berücksichtigung zukünftiger Skalierung - name : Mittellange variable String →
VARCHAR - price : Geldwert → präzises
DECIMAL - stock : Lagerbestand →
INT UNSIGNED - status : Fester Satz von Werten →
ENUM - description : Potenziell langer Text →
TEXT - updated_at : Bequemes auto-updatendes
TIMESTAMP
Wie gezeigt, sollte jede Typwahl eine klare Begründung haben, und die Fähigkeit, diese Begründung zu artikulieren, ist ein Merkmal guten Designs.
6. Häufige Fehler und wie man sie vermeidet
Da MySQL viele Datentypen bietet, treten mehrere häufige Fehler in realen Projekten häufig auf.
Dieser Abschnitt hebt typische Fallstricke hervor und bietet praktische Gegenmaßnahmen.
6.1 Verwendung übermäßig großer Datentypen
Häufige Beispiele
- Alle IDs zu
BIGINTmachen - Jeden String auf
VARCHAR(255)setzen TEXTfür nicht-textuelle Inhalte verwenden
Probleme
- Verschwendeter Speicher
- Aufgeblähte Indizes, die die Abfrageperformance schädigen
- Verschwendete Netzwerkbandbreite (größere Datenübertragungen)
Wie man vermeidet
- Schätzen Sie die maximalen und minimalen Werte im Voraus
- Legen Sie
VARCHAR‑Längen anhand von Belegen fest - Verwenden Sie
TEXTnur, wenn es wirklich nötig ist
6.2 Verwendung von FLOAT/DOUBLE für Dezimalwerte (Präzisionsprobleme)
Allgemeine Beispiele
- Preise als
FLOATspeichern - Numerische Vergleiche schlagen wegen Rundungsfehlern fehl
Wie man es vermeidet
- Verwenden Sie
DECIMALfür Geld und präzisionskritische Werte - Vermeiden Sie
FLOAT/DOUBLE, außer für wissenschaftliche oder temporäre Berechnungen
6.3 Zu große VARCHAR‑Spalten
Allgemeine Beispiele
VARCHAR(255)als Standard verwenden- Lange Längen für Spalten festlegen, die nur etwa 30 Zeichen speichern
Probleme
- Verschwendeter Speicher und Speicherplatz
- Indizes werden oft schwerer
Wie man es vermeidet
- Schätzen Sie durchschnittliche und maximale Längen anhand realer Daten
- Vermeiden Sie unnötig große Größen (z. B. E‑Mail‑Adressen →
VARCHAR(100))
6.4 Übermäßiger Einsatz von TEXT‑Typen
Allgemeine Beispiele
- Annahme „string = TEXT“
TEXTfür Daten verwenden, die gefiltert oder durchsucht werden müssen
Probleme
- Viele Indexierungsbeschränkungen
- Aufwändige
LIKE‑Suchen - Langsamere Verarbeitung bei JOINs
Wie man es vermeidet
TEXTnur für Langform‑Inhalte wie Beschreibungen oder Body‑Texte verwenden- Durchsuchbare Zeichenketten nach Möglichkeit in
VARCHARspeichern
6.5 Auswahl von Datum/Uhrzeit‑Typen ohne deren Eigenschaften zu verstehen
Allgemeine Beispiele
DATETIMEfür alles verwendenDATETIMEfür „updated at“ verwenden, sodass es nicht automatisch aktualisiert wird- Zeitstempel verschieben sich aufgrund von Zeitzonenunterschieden
Wie man es vermeidet
- Benötigt Auto‑Update:
TIMESTAMP - Möchten Zeitzonenverschiebungen vermeiden:
DATETIME - Nur das Jahr benötigt:
YEAR
6.6 Verwendung von ENUM / SET zu lässig
Allgemeine Beispiele
ENUMverwenden, obwohl sich die Optionen in Zukunft ändern könnenSETwie eine kommagetrennte Liste verwenden
Probleme
- Änderungen erfordern
ALTER TABLE - Inkonsistenz mit Definitionen auf Anwendungsseite ist wahrscheinlicher
Wie man es vermeidet
- Wenn Werte zunehmen können, verwalten Sie sie in einer separaten Master‑Tabelle
ENUMnur verwenden, wenn die Menge klein und wirklich fest ist
6.7 Zu viel in JSON packen, weil es praktisch ist
Allgemeine Beispiele
- Strukturen, die normalisiert werden sollten, in JSON packen
- Häufig gesuchte Daten in JSON speichern
Probleme
- Suchleistung verschlechtert sich
- Indizes sind weniger effektiv / schwerer zu nutzen
- Mehr Parsing‑Arbeit auf Anwendungsseite
- Schema‑loses Design erschwert die Konsistenz
Wie man es vermeidet
- JSON nur für Daten verwenden, die Sie nicht durchsuchen
- Auf „kleine, variable Daten“ wie Einstellungen beschränken
- Informationen, die für JOINs und Suchen verwendet werden, normalisieren
6.8 Unterschätzung der Kosten von Typänderungen
Probleme
ALTER TABLEkann bei großen Tabellen extrem schwer sein- Service‑Ausfallzeiten oder lange Sperrzeiten können auftreten
- In einigen Fällen ist Datenmigration erforderlich
Wie man es vermeidet
- Planen Sie zukünftiges Wachstum bereits in der Entwurfsphase
ENUMsorgfältig verwenden- Lassen Sie Spielraum in
DECIMAL‑Präzision/Skala (aber nicht übertreiben)
7. Zusammenfassung
MySQL bietet eine große Auswahl an Datentypen, und der von Ihnen gewählte Typ kann Leistung, Skalierbarkeit und Wartbarkeit erheblich beeinflussen.
Insbesondere in Umgebungen wie Webanwendungen, in denen Daten tendenziell wachsen, wirken sich frühe Designentscheidungen direkt auf die langfristige Qualität aus.
Wesentliche Erkenntnisse in diesem Artikel
- Datentypen sind kritische Faktoren, die „Wertart, Bereich, Präzision, Speicher und Leistung“ beeinflussen.
- Numerische, String-, Datum/Uhrzeit-, JSON-, ENUM/SET- und BLOB‑Typen haben jeweils Stärken und Schwächen.
- Integer, Strings und Datum/Uhrzeit‑Typen werden am häufigsten verwendet, daher ist die richtige Wahl wichtig.
- JSON und ENUM sind praktisch, aber Fehlgebrauch kann die Wartung erschweren.
- Der übermäßige Einsatz von
TEXTundBLOBkann die Leistung mindern. - Ein rationaler Designansatz lautet: „Zweck → Bereich → Leistung → Skalierbarkeit.“
Eine Design‑Checkliste, die Sie ab heute nutzen können
- Ist der Zweck der Spalte klar definiert?
- Verstehen Sie die maximalen und minimalen möglichen Werte?
- Gibt es Nachweise für die gewählte
VARCHAR‑Länge? - Verwenden Sie
DECIMALfür Geldbeträge? - Werden „updated at“-Zeitstempel mit
TIMESTAMPund automatischer Aktualisierung, wo sinnvoll, verwaltet? - Haben Sie vor der Verwendung von
ENUMbedacht, ob die Werte in Zukunft zunehmen könnten? - Vermeiden Sie Designs, bei denen das Suchen durch übermäßige Nutzung von JSON langsam wird?
- Haben Sie das Design so gewählt, dass schwere
ALTER TABLE‑Operationen bei großen Datensätzen vermieden werden?
Finally
Es gibt nicht immer eine einzige „richtige Antwort“ bei der Auswahl von MySQL‑Datentypen.
Allerdings wenn Sie mit Bedacht und Blick auf zukünftiges Wachstum wählen, können Sie größere Probleme verhindern und Ihre Datenstruktur sauber halten.
Letztlich hängt die beste Wahl von der Art Ihres Projekts, dem Datenvolumen und den Anforderungen der Anwendung ab. Wenn Sie jedoch die in diesem Artikel vorgestellten Kriterien als Grundlage nutzen, sollten Sie in jeder Situation bessere Entscheidungen bei Datentypen treffen können.
Als Nächstes stellen wir einen FAQ‑Abschnitt vor, der häufig im Arbeitsalltag gestellte Fragen zusammenfasst.
Wenn Sie sich bei der Typauswahl unsicher sind, hilft Ihnen ein Blick in dieses FAQ, schneller die richtige Entscheidung zu treffen.
8. FAQ
Die Wahl von MySQL‑Datentypen ist ein Bereich, in dem Entscheidungen stark variieren können, abhängig von praktischen Erfahrungen.
Hier sammeln wir häufige Fragen von Entwicklungsteams und geben kurze, klare Antworten.
Q1. Soll ich INT oder BIGINT verwenden?
A: Verwenden Sie standardmäßig INT. Nutzen Sie BIGINT nur, wenn in Zukunft mehr als 2,1 Milliarden Werte möglich sein könnten.
INT (4 Byte) unterstützt bis etwa 2,1 Milliarden und reicht für die meisten Anwendungen aus.
Betrachten Sie BIGINT für Protokolle, stark frequentierte Dienste oder Systeme, die extrem viele IDs erzeugen könnten.
Q2. Soll ich VARCHAR oder TEXT verwenden?
A: Verwenden Sie VARCHAR, wenn Sie suchen müssen. Nutzen Sie TEXT für Langform‑Inhalte.
VARCHAR: indexfreundlich und besser für SuchenTEXT: gut für lange Inhalte, aber nicht ideal für Suchen oder JOINs
※ Ein übermäßiger Einsatz von TEXT kann zu Performance‑Einbußen führen.
Q3. Ist es in Ordnung, Geld als DOUBLE zu speichern?
A: Nein. Verwenden Sie immer DECIMAL.
DOUBLE und FLOAT können Rundungsfehler erzeugen und eignen sich daher nicht für Geld oder präzisionskritische Werte.
In Geschäftsanwendungen ist DECIMAL(10,2) oder DECIMAL(12,2) ein gängiger Standard.
Q4. Ich verstehe den Unterschied zwischen DATETIME und TIMESTAMP nicht. Wie soll ich wählen?
A: Verwenden Sie TIMESTAMP, wenn Sie Auto‑Updates benötigen. Nutzen Sie DATETIME, wenn Sie einen genauen Zeitstempel ohne Zeitzonen‑Umwandlung speichern müssen.
TIMESTAMP: Auto‑Update und Zeitzonen‑UmwandlungDATETIME: Unabhängig von Zeitzonen; speichert Datum/Zeit „wie angegeben“
DATETIME wird häufig für Protokolle und Historientabellen verwendet.
Q5. Ist die Verwendung von ENUM sicher?
A: Sie ist nur sinnvoll, wenn die Werte „garantiert unveränderlich“ sind.
ENUM ist leichtgewichtig und praktisch, aber das Hinzufügen oder Ändern von Werten erfordert ein ALTER TABLE.
Für Felder, die wachsen können, wird die Verwaltung in einer separaten Master‑Tabelle empfohlen.
Q6. Kann ich vorerst einfach JSON verwenden?
A: Verwenden Sie JSON nur für Daten, die Sie nicht durchsuchen. Daten, die Sie durchsuchen, sollten normalisiert sein.
JSON ist flexibel, hat jedoch Schwächen in der Performance.
- Schwach beim Suchen
- Indexstrukturen werden komplexer
- Schwieriger, Datenkonsistenz zu wahren
Es eignet sich gut für Einstellungen und Optionen — Attribute, die nicht als Suchkriterien verwendet werden.
Q7. Wie bestimme ich die maximale Länge für VARCHAR?
A: Schätzen Sie das Maximum anhand realer Daten und fügen Sie einen kleinen Puffer hinzu.
Beispiel: E‑Mail‑Adresse → VARCHAR(100) ist ausreichend
Beispiel: Benutzername → VARCHAR(50) ist oft passend
„255 nur weil“ wird nicht empfohlen.
Q8. Wenn ich den falschen Typ gewählt habe, kann ich ihn später ändern?
A: Ja, aber das kann bei großen Tabellen sehr aufwendig sein.
ALTER TABLE erfordert oft vollständige Scans und Neuaufbauten,
was zu Ausfallzeiten oder langen Sperrzeiten führen kann.
→ Sorgfältige Planung in der anfänglichen Designphase ist am wichtigsten.

