Einführung
Eines der Hauptmerkmale relationaler Datenbanken im Allgemeinen ist die Fähigkeit, Schemata oder Tabellenstrukturen zu definieren, die das Format der darin enthaltenen Daten genau angeben. Dies geschieht durch Vorgabe der Spalten, die diese Strukturen enthalten, zusammen mit ihrem Datentyp und alle Einschränkungen.
Datentypen geben ein allgemeines Muster für die Daten an, die sie akzeptieren und speichern. Werte müssen den Anforderungen entsprechen, die sie beschreiben, um von MySQL akzeptiert zu werden. Während es möglich ist, benutzerdefinierte Anforderungen zu definieren, stellen Datentypen die grundlegenden Bausteine bereit, die es MySQL ermöglichen, Eingaben zu validieren und mit den Daten unter Verwendung geeigneter Operationen zu arbeiten.
MySQL enthält eine breite Palette von Datentypen, die verwendet werden, um zu kennzeichnen und zu validieren, dass Werte den entsprechenden Typen entsprechen. In diesem Leitfaden besprechen wir die gängigsten in MySQL verfügbaren Datentypen, die verschiedenen Eingabe- und Ausgabeformate, die sie verwenden, und wie Sie verschiedene Felder konfigurieren, um die Anforderungen Ihrer Anwendungen zu erfüllen.
Was sind die Datentypen in MySQL?
Bevor wir ins Detail gehen, werfen wir einen groben Überblick darüber, welche Datentypen MySQL bereitstellt.
MySQL unterstützt eine angemessene Auswahl an Datentypen, die für verschiedene Arten einfacher und komplexer Daten geeignet sind. Dazu gehören:
TINYINT
SMALLINT
MEDIUMINT
INT
BIGINT
DECIMAL
NUMERIC
FLOAT
DOUBLE
BIT
DATE
DATETIME
TIMESTAMP
TIME
YEAR
CHAR
VARCHAR
BINARY
VARBINARY
BLOB
TEXT
ENUM
SET
GEOMETRY
POINT
LINESTRING
POLYGON
MULTIPOINT
MULTILINESTRING
MULTIPOLYGON
GEOMETRYCOLLECTION
JSON
Wir werden die häufigsten davon in diesem Leitfaden ausführlicher behandeln.
Erste Schritte mit MySQL-Datentypen
Wenn Sie mit Typen beginnen, ist es wichtig, daran zu denken, dass Typen allein nicht immer eine vollständige Lösung für die Datenvalidierung sind, sondern eine Komponente. Andere Datenbankwerkzeuge, wie z. B. Einschränkungen, spielen ebenfalls eine Rolle bei der Definition der Korrektheit. Dennoch sind Datentypen häufig die erste Verteidigungslinie gegen ungültige Daten.
In vielen Fällen sind die von MySQL bereitgestellten allgemeinen Typen für die Arten von Daten geeignet, die Sie speichern werden. Während Sie beispielsweise die Koordinaten eines geometrischen Punktes in zwei verschiedenen Zahlenspalten speichern könnten, wird der bereitgestellte point
type wurde speziell entwickelt, um genau diese Art von Informationen zu speichern und zu validieren. Überprüfen Sie bei der Auswahl von Typen, ob Sie den spezifischsten Typ verwenden, der für Ihren Anwendungsfall geeignet ist.
Zahlen und numerische Werte
MySQL enthält eine Reihe numerischer Datentypen, die für verschiedene Szenarien geeignet sind. Der geeignete Typ hängt von der genauen Art der Werte ab, die Sie speichern möchten, sowie von Ihren Genauigkeitsanforderungen.
Ganzzahlen
Die Ganzzahl Der Datentyp ist eine Kategorie von Typen, die zum Speichern von Zahlen ohne Brüche oder Dezimalstellen verwendet werden. Dies können entweder positive oder negative Werte sein, und verschiedene Integer-Typen können verschiedene Zahlenbereiche speichern. Integer-Typen mit kleineren Bereichen akzeptabler Werte nehmen weniger Platz ein als solche mit größeren Bereichen.
Die Grundliste der Integer-Typen umfasst Folgendes:
Ganzzahltyp | Länge | Anwendbarer vorzeichenbehafteter Bereich | Anwendbarer vorzeichenloser Bereich |
---|---|---|---|
TINYINT | 1 Byte | -128 bis 127 | 0 bis 255 |
SMALLINT | 2 Byte | -32768 bis 32767 | 0 bis 65535 |
MEDIUMINT | 3 Byte | -8388608 bis 8388607 | 0 bis 16777215 |
INT | 4 Byte | -2147483648 bis 2147483647 | 0 bis 4294967295 |
BIGINT | 8 Byte | -2^63 bis -2^63-1 | 0 bis 2^64-1 |
Die oben genannten Typen sind durch ihren gültigen Bereich begrenzt. Jeder Wert außerhalb des Bereichs führt zu einem Fehler.
Zusätzlich zu den oben erwähnten Typen erkennt MySQL auch einen Alias namens SERIAL
. Markieren einer Spalte als SERIAL
gibt ihm diese Eigenschaften:BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
. Dies wird als Kurzform für gemeinsame Eigenschaften von Primärschlüsselspalten verwendet. Der Spalte wird automatisch ein neuer eindeutiger Wert zugewiesen, wenn ein Datensatz hinzugefügt wird.
Fixpunkt
Festkommatypen werden verwendet, um die Menge an Präzision zu steuern oder Spezifität möglich für eine Zahl mit Dezimalstellen. In MySQL kann dies durch Manipulieren von zwei Faktoren gesteuert werden:Genauigkeit und Skalierung.
Präzision ist die maximale Gesamtzahl an Ziffern, die eine Zahl haben kann. Im Gegensatz dazu skalieren ist die Anzahl der Ziffern rechts vom Dezimalpunkt. Indem Sie diese Zahlen manipulieren, können Sie steuern, wie groß die gebrochenen und nicht gebrochenen Komponenten einer Zahl sein dürfen.
Diese beiden Argumente werden verwendet, um die willkürliche Genauigkeit mithilfe von numeric
zu steuern oder decimal
Datentypen (diese beiden Typen sind in MySQL synonym). Der numeric
Typ nimmt null bis zwei Argumente an.
Ohne Argumente ist die Spalte mit einer Genauigkeit von 10 und einer Skalierung von 0 definiert. Das bedeutet, dass die Spalte bis zu 10 Ziffern enthalten kann, aber keine davon darf nach dem Dezimalkomma stehen:
NUMERIC
Wenn ein einzelnes Argument angegeben wird, wird es als Genauigkeit der Spalte mit auf 0 gesetzter Skalierung interpretiert. Dadurch können Sie effektiv die maximale Anzahl von Ziffern in einer ganzzahligen Zahl angeben (keine Bruch- oder Dezimalkomponenten). Wenn Sie beispielsweise eine 5-stellige ganze Zahl benötigen, können Sie Folgendes angeben:
NUMERIC(5)
Geben Sie die Genauigkeit gefolgt von der Skalierung an, wenn Sie eine Spalte mit beiden Steuerelementen konfigurieren. MySQL rundet die Dezimalkomponente jeder Eingabe mithilfe der Skalenzahl auf die richtige Anzahl von Ziffern. MySQL verwendet die Genauigkeit und Skalierung, um zu bestimmen, wie viele Stellen auf der linken Seite des Dezimalkommas zulässig sind. Wenn ein Eintrag die zulässige Anzahl von Ziffern überschreitet, erzeugt MySQL einen Fehler.
Beispielsweise können wir eine Spalte mit einer Gesamtgenauigkeit von 5 und einer Skalierung von 2 angeben:
NUMERIC(5, 2)
Diese Spalte hätte das folgende Verhalten:
Eingabewert | Gerundeter Wert | Akzeptiert (Passgenauigkeit)? |
---|---|---|
400.28080 | 400.28 | Ja |
8.332799 | 8.33 | Ja |
11799.799 | 11799,80 | Nein |
11799 | 11799 | Nein |
2802.27 | 2802.27 | Nein |
Fließkomma
Fließkommazahlen sind eine weitere Möglichkeit, Dezimalzahlen auszudrücken, jedoch ohne exakte, konsistente Genauigkeit. Stattdessen haben Fließkommatypen nur ein Konzept einer maximalen Genauigkeit, die oft mit der Architektur und Plattform der Hardware zusammenhängt.
Um beispielsweise eine Fließkommaspalte auf eine Genauigkeit von 8 Stellen zu beschränken, können Sie den FLOAT
verwenden Typ, der Ergebnisse mit 4 Bytes mit einer Genauigkeit von 0 bis 23 Stellen speichert:
FLOAT(8)
Ebenso der DOUBLE
Typ verwendet 8 Bytes zum Speichern von Daten und kann Genauigkeiten von 24 bis 53 Stellen verwenden.
Aufgrund dieser Designentscheidungen können Gleitkommazahlen effizient mit Zahlen mit einer großen Anzahl von Dezimalstellen arbeiten, aber nicht immer genau. Durch die interne Zahlendarstellung kann es zu geringfügigen Abweichungen zwischen Ein- und Ausgabe kommen. Dies kann zu unerwartetem Verhalten führen, wenn Werte verglichen, Gleitkommaberechnungen durchgeführt oder Operationen ausgeführt werden, die genaue Werte erfordern.
Gleitkomma vs. numerisch
Beides Fließkommazahlen, die von Typen wie FLOAT
bereitgestellt werden und DOUBLE
und Festkommazahlen, die durch NUMERIC
bereitgestellt werden oder DECIMAL
-Typen können zum Speichern von Dezimalwerten verwendet werden. Woher wissen Sie, welches Sie verwenden sollen?
Die allgemeine Regel lautet:Wenn Sie bei Ihren Berechnungen Genauigkeit benötigen, verwenden Sie NUMERIC
Typ ist immer die bessere Wahl. Der NUMERIC
type speichert Werte genau so, wie sie bereitgestellt werden, was bedeutet, dass die Ergebnisse beim Abrufen oder Berechnen von Werten vollständig vorhersehbar sind. Der NUMERIC
Der Typ wird als beliebige Genauigkeit bezeichnet, weil Sie die Genauigkeit angeben, die der Typ erfordert, und genau diese Anzahl von Ziffern im Feld speichern wird.
Im Gegensatz dazu Typen wie FLOAT
und DOUBLE
sind Typen mit variabler Genauigkeit. Die Genauigkeit, die sie beibehalten, hängt vom Eingabewert ab. Wenn sie das Ende ihrer zulässigen Genauigkeit erreichen, können sie die verbleibenden Stellen runden, was zu Differenzen zwischen den gesendeten und abgerufenen Werten führt.
Wann würden Sie Typen mit variabler Genauigkeit verwenden? Typen mit variabler Genauigkeit wie FLOAT
und DOUBLE
eignen sich gut für Szenarien, in denen genaue Werte nicht erforderlich sind (z. B. wenn sie sowieso gerundet werden) und in denen Geschwindigkeit sehr wichtig ist. Die variable Genauigkeit bietet im Allgemeinen Leistungsvorteile gegenüber NUMERIC
Typ.
String-Typen
Die Zeichentypen und Zeichenfolgentypen von MySQL können in zwei Kategorien eingeteilt werden:feste Länge und variable Länge . Die Wahl zwischen diesen beiden beeinflusst, wie MySQL Platz für jeden Wert zuweist und wie es Eingaben validiert.
Der einfachste zeichenbasierte Datentyp in MySQL ist char
Typ. Ohne Argumente ist das char
type akzeptiert ein einzelnes Zeichen als Eingabe:
CHAR
Wenn in der Deklaration eine positive ganze Zahl angegeben wird, wird der char
Spalte speichert eine Zeichenkette fester Länge gleich der Anzahl der angegebenen Zeichen:
CHAR(10)
Wird ein String mit weniger Zeichen versehen, werden Leerzeichen angehängt, um die Länge aufzufüllen:
Eingabe | Anzahl der Eingabezeichen | Gespeicherter Wert | # der gespeicherten Zeichen |
---|---|---|---|
'Baum' | 4 | 'Baum ' | 10 |
Wenn eine Zeichenfolge mit mehr als der zulässigen Anzahl von Zeichen angegeben wird, löst MySQL einen Fehler aus. Als Ausnahme von dieser Regel, wenn die überlaufenden Zeichen alle Leerzeichen sind, schneidet MySQL einfach die überschüssigen Leerzeichen ab, damit sie in das Feld passen.
Die Alternative zu Zeichenfeldern mit fester Länge sind Felder mit variabler Länge. Dafür stellt MySQL den varchar
zur Verfügung Typ. Der varchar
type speichert Zeichen ohne feste Größe. Im Gegensatz zu char
, varchar
kann nicht verwendet werden, ohne die maximale Anzahl zu speichernder Zeichen anzugeben.
Durch die Definition eines varchar
mit einer positiven Ganzzahl können Sie eine maximale Zeichenfolgenlänge festlegen:
VARCHAR(10)
Dies unterscheidet sich von der Verwendung des char
Typ mit einer Ganzzahl in diesem varchar
füllt den Wert nicht auf, wenn die Eingabe die maximale Feldlänge nicht erreicht:
Eingabe | Anzahl der Eingabezeichen | Gespeicherter Wert | # der gespeicherten Zeichen |
---|---|---|---|
'Baum' | 4 | 'Baum' | 4 |
Wenn die Zeichenfolge größer als die maximale Länge ist, gibt MySQL einen Fehler aus. Dasselbe Abschneideverhalten wie in char
Felder kommt hier vor:Wenn die überlaufenden Zeichen Leerzeichen sind, werden sie abgeschnitten, um in die maximale Zeichenlänge zu passen.
MySQL unterstützt auch die binary
und varbinary
Datentypen. Diese funktionieren ähnlich wie char
und varchar
-Typen, speichern aber binäre Zeichenfolgen statt Zeichenfolgen. Dies hat Auswirkungen darauf, wie sie gespeichert und verarbeitet werden (für Dinge wie Vergleiche, Sortierung usw.).
Für binary
und varbinary
-Typen repräsentiert die bei der Definition des Spaltentyps angegebene Ganzzahl die Anzahl der Bytes anstelle der Anzahl der Zeichen.
Zwei weitere Datentypen, die MySQL für Strings und Zeichenspeicherung bereitstellt, sind blob
und text
. Diese Typen funktionieren ähnlich wie varchar
und varbinary
Typen und sind für die Aufbewahrung großer Objekte gedacht. Sie funktionieren größtenteils genauso wie ihre Gegenstücke, weisen jedoch einige Unterschiede auf, z. B. können sie keine Standardwerte haben und erfordern eine Präfixlänge beim Erstellen eines Index.
Booleans
MySQL hat eigentlich keinen nativen booleschen Typ, um wahre und falsche Werte darzustellen.
MySQL kennt die Typen BOOL
oder BOOLEAN
im Bemühen um Kompatibilität mit anderen Datenbanksystemen. Seine interne Implementierung verwendet jedoch ein TINYINT(1)
Spalte zum Speichern der Werte und interpretiert sie basierend auf einer Reihe von Regeln als wahr oder falsch.
Bei der Interpretation numerischer Werte in einem booleschen Kontext der Wert von 0
gilt als falsch. Alle Nicht-Null-Werte werden als wahr betrachtet.
MySQL erkennt die booleschen Literale TRUE
und FALSE
und wandelt TRUE
um auf 1 und FALSE
auf 0 gesetzt, wenn sie gespeichert werden.
Datum und Uhrzeit
MySQL unterstützt die Darstellung von Datumsangaben, Uhrzeiten und Kombinationen der beiden.
Termine
Das date
Typ kann ein Datum ohne zugeordneten Zeitwert speichern:
DATE
Bei der Verarbeitung der Eingabe für date
-Spalten kann MySQL verschiedene Formate interpretieren, um das richtige zu speichernde Datum zu bestimmen. Die Bestandteile müssen jedoch immer in der gleichen Reihenfolge kommen:Jahr, Monat und dann Tag. Das STR_TO_DATE()
Funktion ist verfügbar, um andere Datumsformate in ein Format zu konvertieren, das MySQL korrekt interpretiert.
Bei der Anzeige von Datumsangaben verwendet MySQL den YYYY-MM-DD
Format. Sie können das DATE_FORMAT()
verwenden Funktion zum Formatieren der Ausgabe in anderen Formaten.
Das date
type kann Werte zwischen 1000-01-01
speichern bis 9999-12-31
.
Zeit
Die time
Datentyp kann eine bestimmte Tageszeit ohne zugeordnete Zeitzone oder Datum speichern.
Bei der Verarbeitung von Eingaben für time
-Spalten kann MySQL mehrere Formate interpretieren, um die richtige Zeit zum Speichern zu bestimmen. Wenn die Eingabe Doppelpunkte enthält, wird sie im Allgemeinen als hh:mm:ss
interpretiert . Jeder verkürzte Wert (der nur eine Spalte verwendet) wird als hh:mm
interpretiert . Wenn die Eingabe nicht Doppelpunkte haben, wird die Zeit verarbeitet, um den kleinsten Wert zuerst aufzufüllen. Beispiel:1045
wird als 10 Minuten und 45 Sekunden angenommen.
MySQL unterstützt auch Bruchteile von Sekunden, wenn ein Dezimalpunkt angegeben wird. Es speichert bis zu 6 Nachkommastellen. Werte in time
Spalten können von -838:59:59.000000
reichen bis 838:59:59.000000
.
Beim Anzeigen von Zeitwerten verwendet MySQL den hh:mm:ss
Format. Wie bei Datumsangaben wird eine Funktion namens TIME_FORMAT()
bereitgestellt um Zeitwerte in anderen Formaten anzuzeigen.
Zeitstempel und datetime
MySQL kann Zeitstempel, eine Kombination aus Datum und Uhrzeit, die verwendet wird, um einen bestimmten Zeitpunkt darzustellen, in zwei verschiedenen Variationen darstellen:unter Verwendung des timestamp
type und datetime
Typ.
Die datetime
type kann Werte von 1000-01-01 00:00:00
darstellen bis 9999-12-31 23:59:59
. Es kann auch Bruchteile von Sekunden mit bis zu sechs Ziffern enthalten, ähnlich wie bei time
Typ.
Der timestamp
type kann Werte von 1970-01-01 00:00:01
darstellen UTC bis 2038-01-19 03:14:07
KOORDINIERTE WELTZEIT. Es kann auch Bruchteile von Sekunden verarbeiten. Beim Speichern von timestamp
Werten werden alle Werte von der angegebenen Zeitzone in UTC zur Speicherung konvertiert und beim Abruf wieder in die lokale Zeitzone konvertiert. Die datetime
type tut dies nicht.
Ab MySQL 8.0.19 können Sie beim Speichern eines timestamp
einen Zeitzonenoffset einschließen um die Zeitzone für den gespeicherten Wert explizit festzulegen. Sie tun dies, indem Sie nach der Zeitkomponente einen Wert einfügen, ohne Leerzeichen, um den Offset anzugeben. Der Bereich der akzeptierten Werte reicht von -14:00
bis +14:00
, der den Offset des gespeicherten Werts von UTC darstellt.
Bei der Entscheidung, ob Datums- und Uhrzeitwerte mit datetime
gespeichert werden sollen oder timezone
Arten, ist es oft hilfreich, sie danach zu trennen, wofür sie am besten geeignet sind.
Denken Sie an datetime
Werte als bestimmtes Datum und Uhrzeit, in Bezug auf den Kalender und die Uhrzeit, wo immer sie abgerufen werden. Wenn eine Person abends um 23 Uhr ins Bett geht, ein datetime
value kann diesen Wert darstellen, unabhängig davon, in welcher Zeitzone sich die Person gerade befindet.
Andererseits timezone
Werte stellen am besten einen bestimmten Zeitpunkt dar, der über Zeitzonen hinweg eindeutig ist. Um eine Einladung zu einem Videoanruf zu senden, eine timezone
value wäre in der Lage sicherzustellen, dass das Meeting für alle zur gleichen Zeit stattfindet, unabhängig davon, in welcher Zeitzone sich der Teilnehmer befindet.
Andere nützliche Typen
Neben den Typen, die wir oben ausführlich behandelt haben, gibt es weitere Typen, die in bestimmten Szenarien nützlich sind. Wir werden diese kurz behandeln, um Ihnen eine Vorstellung davon zu geben, wie Sie sie verwenden und wann sie nützlich sein können.
Aufzählungs- und Set-Typen
Zwei verwandte Typen, mit denen Benutzer die gültigen Werte für eine Spalte vorgeben können, sind enum
und set
Typen.
Die enum
Typ ist ein Zeichenfolgentyp, der es dem Benutzer ermöglicht, eine Sammlung gültiger Werte zu definieren, wenn die Spalte erstellt wird. Jeder Wert, der mit einem der definierten Werte übereinstimmt, wird akzeptiert und alle anderen Werte werden abgelehnt. Dies funktioniert ähnlich wie ein Dropdown-Menü, da eine Auswahl aus einem bestimmten Satz von Optionen getroffen werden kann. Zum Beispiel eine enum
genannt season
könnte mit den Werten winter
erstellt werden , spring
, summer
, und autumn
.
Um eine enum
zu erstellen Spalte, geben Sie den Typ als enum
an , wobei die möglichen Werte als Strings angegeben werden, getrennt durch Kommas, innerhalb einer Reihe von Klammern, wie hier:
season ENUM('winter', 'spring', 'summer', 'autumn')
Ein ähnlicher benutzerdefinierter Typ ist set
Typ. Wie die enum
Typ, set
-Typen ermöglichen es Benutzern, bei der Definition gültige Werte als Zeichenfolgen anzugeben. Der Unterschied zwischen diesen beiden Typen besteht in einem set
, kann für jeden Datensatz mehr als ein Wert gespeichert werden.
Wenn Sie beispielsweise eine Spalte benötigen, um die Wochentage darzustellen, an denen Freiwillige arbeiten können, könnten Sie einen set
haben Spalte wie folgt:
availability SET('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday')
Bei der Eingabe von Werten für die availability
Spalte, die wir gerade erstellt haben, geben Sie eine einzelne Zeichenfolge mit Kommas an, die alle Tage trennt, an denen der Freiwillige verfügbar ist. Zum Beispiel:
'monday,tuesday,wednesday,thursday,friday''sunday,saturday''monday,wednesday,friday''thursday'
Für set
-Typen in MySQL werden doppelte Werte in der Eingabe immer entfernt und beim Abrufen folgen die Werte der im set
verwendeten Reihenfolge Definition unabhängig von der Reihenfolge bei der Eingabe in die Spalte.
JSON
MySQL unterstützt Spalten in JSON mit json
Typ. Daten gespeichert als json
wird zur schnelleren Ausführung und Verarbeitung binär gespeichert, sodass der Server keine Zeichenfolge interpretieren muss, um mit JSON
zu arbeiten Werte.
JSON
Um mit JSON
zu arbeiten Spalten bietet MySQL eine Reihe von Funktionen, um mit Werten innerhalb des Dokuments zu arbeiten.
Fazit
In diesem Artikel haben wir viele der gängigsten Datentypen behandelt, die bei der Arbeit mit MySQL-Datenbanken nützlich sind. Es gibt weitere Typen, die in diesem Handbuch nicht behandelt werden und deren Kenntnis hilfreich ist, aber diese stellen einen guten Ausgangspunkt für die meisten Anwendungsfälle dar.
Es ist wichtig, das Typsystem angemessen zu verwenden, damit Sie gültige Werte steuern und wie erwartet mit Daten arbeiten können. Es gibt Fallstricke, auf die Sie stoßen können, wenn Sie einen Typ auswählen, der für Ihre Daten nicht geeignet ist. Daher lohnt es sich in den meisten Fällen, darüber nachzudenken, bevor Sie sich auf einen Datentyp festlegen.
Wenn Sie Prisma Client verwenden, um mit Ihren MySQL-Datenbanken zu arbeiten, finden Sie eine Zuordnung zwischen einigen der gängigen MySQL- und Prisma-Typen in der Dokumentation zu MySQL-Datenkonnektoren von Prisma.