Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Eine Einführung in MySQL-Datentypen


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.