Die Auswahl des richtigen Datentyps für eine Tabellenspalte ist eine wichtige Entscheidung. Es reduziert die Notwendigkeit von Datentypkonvertierungen, verbessert die Leistung von Datenbankabfragen und minimiert den Speicherbedarf.
In diesem Handbuch lernen Sie die verschiedenen Datentypen kennen, die in relationalen Datenbankverwaltungssystemen (RDBMS) verwendet werden. Diese Datentypen können beim Erstellen oder Ändern einer Tabelle oder beim Deklarieren von Variablen in gespeicherten Datenbankprozeduren verwendet werden. Einige bekannte RDBMS sind MySQL und PostgreSQL.
SQL-Binärdatentypen
Zum Speichern von Binärdaten (0
oder 1
), verwenden Sie den BINARY
und VARBINARY
Datentypen. Der BINARY
Der Datentyp speichert binäre Daten fester Länge, während VARBINARY
speichert Binärdaten variabler Länge. Diese beiden Datentypen werden zum Speichern von Bitfolgen (0
’s und 1
's). Ihre Werte werden mithilfe der hexadezimalen Darstellung zugewiesen und abgerufen, was durch das Präfix 0x
angezeigt wird . Die Spalten (oder Variablen) der beiden Binary
und VarBinary
Datentypen werden verwendet, um den Inhalt von Bilddateien wie JPEG, BMP, Dokumentdateien usw. zu speichern.
Zum Beispiel für einen Dezimalwert von 63
, sein Hexadezimalwert wird durch 0x3F
dargestellt und sein binäres Bit-String-Äquivalent ist 111111
. Betrachten Sie das folgende Beispiel, um den Wert dieser binären Zeichenfolgen und ihre Speicherung zu verstehen:
Hinweis Sofern nicht anders erwähnt, funktionieren alle Datenbankbefehle, die in diesem Handbuch gezeigt werden, sowohl auf MySQL als auch gut und PostgreSQL .
-
Erstellen Sie über die Befehlszeile eine Tabelle mit dem Namen
BinaryExample
wie unten gezeigt:CREATE TABLE BinaryExample ( BinaryCol BINARY (10), VarBinaryCol VARBINARY (10) );
-
Fügen Sie eine Zeile in das
BinaryExample
ein Tabelle:INSERT INTO BinaryExample (BinaryCol, VarBinaryCol) VALUES (0x4D7953514C, 0x39274D);
-
Wählen Sie die Daten aus dem
BinaryExample
aus Tabelle:SELECT BinaryCol, VarBinaryCol FROM BinaryExample;
Die Ausgabe sieht wie folgt aus:
+------------------------+----------------------------+ | BinaryCol | VarBinaryCol | +------------------------+----------------------------+ | 0x4D7953514C0000000000 | 0x39274D | +------------------------+----------------------------+
Wie Sie sehen können, ist die BinaryCol
data wird mit nachgestellten Nullen bis zur maximalen Spaltengröße aufgefüllt, aber die VarBinaryCol
Datenspalte ist es nicht. Das liegt daran, dass die Spalten von VarBinaryCol
sind als variable Länge definiert.
Hinweis Die maximale Größe (Länge) der Datentypen Binary und VarBinary variiert je nach Datenbankimplementierung. Sie sind im Allgemeinen ziemlich groß (über 8.000 Bytes). Einige Datenbankimplementierungen haben binäre Erweiterungen zu diesen Kerndatentypen, die Daten in Größen von mehreren Gigabyte speichern können.
Numerische SQL-Datentypen
Die verfügbaren numerischen Datentypen können in die folgenden Gruppen unterteilt werden:ganzzahlige numerische Datentypen, exakte numerische Datentypen und ungefähre numerische Datentypen. In den folgenden Abschnitten wird jede Gruppe besprochen.
Ganzzahlige numerische Datentypen
Ganzzahlige Datentypen können Unsigned und Signed sein. Unsigniert kann nur Null und positive Zahlen speichern, wohingegen Signed erlaubt null, positive und negative Zahlen.
Die meisten SQL-Implementierungen unterstützen Integer-Datentypen von INT
, SMALLINT
, und TINYINT
zur Speicherung positiver und negativer ganzer Zahlen. Der ganzzahlige numerische Datentyp, den Sie auswählen, hängt von dem Wertebereich ab, den Sie speichern müssen.
Die folgende Tabelle zeigt die zulässige Speicherung in Bytes für die ganzzahligen numerischen Datentypen und ihre minimalen und maximalen SIGNED-Werte.
Typ | Speicher (Bytes) | Mindestwert SIGNED | Maximalwert SIGNED |
---|---|---|---|
INT | 4 | minus 2^31 (-2147483648) | plus 2^31 (2147483647) |
SMALLINT | 2 | minus 2^15 (-32768) | plus 2^15 (32767) |
TINYINT | 1 | -128 | 127 |
Das folgende Beispiel zeigt die minimalen und maximalen vorzeichenbehafteten Werte von numerischen Integer-Datentypen unter Verwendung einer Tabelle namens NumericExample
.
-
Erstellen Sie über die Befehlszeile das
NumericExample
Tabelle.CREATE TABLE NumericExample ( IntColumn INT, SmallIntColumn SMALLINT, TinyIntColumn TINYINT );
-
Fügen Sie die folgenden Werte in das
NumericExample
ein Tabelle.INSERT INTO NumericExample (IntColumn, SmallIntColumn, TinyIntColumn) VALUES (3258594758, 32767, 255);
Wenn Sie den obigen Befehl ausführen, erhalten Sie ein
Out of range
Fehler, wie in der Ausgabe unten gezeigt. Sie können die Werte3258594758
nicht einfügen und255
zuIntColumn
undTinyIntColumn
bzw. Dies liegt daran, dass der maximale SIGNED-Wert für einen ganzzahligen Datentyp2147483647
ist und die eines TinyInt ist127
.ERROR 1264 (22003): Out of range value for column 'IntColumn' at row 1
-
Aktualisieren Sie die Werte von
IntColumn
undTinyIntColumn
Spalten und führen SieINSERT
erneut aus Befehl.INSERT INTO NumericExample (IntColumn, SmallIntColumn, TinyIntColumn) VALUES (2147483647, 32767, 127);
-
Rufen Sie die Spaltenwerte mit
SELECT
ab Aussage:SELECT IntColumn, SmallIntColumn, TinyIntColumn FROM NumericExample;
Die Ausgabe ähnelt dem folgenden Beispiel:
+------------+----------------+---------------+ | IntColumn | SmallIntColumn | TinyIntColumn | +------------+----------------+---------------+ | 2147483647 | 32767 | 127 | +------------+----------------+---------------+
Dezimalnumerische Datentypen (exakt numerisch)
Die Decimal-Datentypen, DECIMAL
und NUMERIC
, speichern Sie genaue und feste numerische Werte. Diese Datentypen werden auch als exakt numerisch bezeichnet Datentypen. Sie speichern einen ganzzahligen Wert links vom Dezimalkomma und einen Bruchwert rechts vom Dezimalkomma. Sie sind funktional gleichwertig mit den gleichen Speicheranforderungen. Der für diese Typen verwendete Speicher hängt von der angegebenen Genauigkeit und den angegebenen Bereichen ab. Sie können zwischen 2 Byte und 17 Byte lang sein, und ihre Werte können zwischen -10^38 +1
liegen an +10^38 -1
.
Diese beiden Datentypen werden durch eine Präzision definiert und eine Skala . Die Präzision bezeichnet die Anzahl der Stellen links und rechts vom Dezimalpunkt zusammen, während die Skala die Gesamtzahl der Stellen rechts vom Dezimalpunkt angibt. Diese beiden Datentypen werden mit der folgenden Syntax erstellt:
DECIMAL(precision, scale)
oder
NUMERIC(precision,scale)
Das folgende Beispiel zeigt, wie der dezimale numerische Datentyp erstellt und verwendet wird.
-
Erstellen Sie über die Befehlszeile das
ExactNumericExample
Tabelle.CREATE TABLE ExactNumericExample ( DecimalCol DECIMAL(5,2), NumericCol NUMERIC(7,2) );
-
Fügen Sie die folgenden Werte in das
ExactNumericExample
ein Tabelle.INSERT INTO ExactNumericExample (DecimalCol, NumericCol) VALUES (123.45, 12345.67);
-
Rufen Sie die Spaltenwerte mit
SELECT
ab Aussage:SELECT DecimalCol, NumericCol FROM ExactNumericExample;
Die Ausgabe sieht wie folgt aus:
+------------+------------+ | DecimalCol | NumericCol | +------------+------------+ | 123.45 | 12345.67 | +------------+------------+
Numerische Fließkomma-Datentypen (ungefähr numerisch)
Die numerischen Fließkomma-Datentypen sind FLOAT
und REAL
. Sie werden auch ungefähr numerisch genannt Datentypen. Diese Datentypen speichern aufgrund der binären Darstellung von Fließkommadaten einen ungefähren Wert. Die Syntax zum Erstellen einer Gleitkommaspalte oder -variablen lautet wie folgt:
Float(N)
Der Parameter N
gibt an, ob das Feld vier oder acht Bytes enthalten soll. Ein Wert von N
größer als sieben erfordert acht Bytes; sieben oder weniger erfordern vier Bytes. Die Floating-Genauigkeit für diesen Datentyp reicht von -1.79E + 308
zu 1.79E + 308
.
Ebenso eine Spalte und Variable, die als Datentyp REAL
definiert sind belegt vier Byte Speicherplatz und stellt einen Wertebereich von -3.40E + 38
bereit bis 3.40E + 38
.
SQL-Zeichendatentypen
Die Datentypen CHAR
und VARCHAR
werden verwendet, um Zeichendaten mit einer Länge von bis zu 8.000 Byte zu speichern. Diese beiden Datentypen speichern Zeichenfolgenwerte in Datenbankspalten, unterscheiden sich jedoch darin, wie ihre Werte gespeichert und abgerufen werden. Die Länge des CHAR
Der Datentyp bleibt auf seiner angegebenen Länge festgelegt, unabhängig davon, ob dieser Zuordnungsraum verwendet wird oder nicht. Wenn das Leerzeichen nicht verwendet wird, wird die Spalte oder Variable mit zusätzlichen Leerzeichen aufgefüllt. VARCHAR
gibt den Wert so aus, wie er ist, ohne zusätzliche Leerzeichen.
Das folgende Beispiel demonstriert den Zeichendatentyp.
-
Erstellen Sie über die Befehlszeile den
Employee
Tabelle.CREATE TABLE Employee ( LastName VARCHAR(25), FirstName VARCHAR(20), Sex CHAR(1) );
-
Fügen Sie die folgenden Werte in den
Employee
ein Tabelle.INSERT INTO Employee (LastName, FirstName, Sex) VALUES ('Jones', 'Mary', 'F');
-
Rufen Sie die Spaltenwerte mit
SELECT
ab Aussage:SELECT LastName, FirstName, Sex FROM Employee;
Die Ausgabe würde wie folgt aussehen:
+----------+-----------+------+ | LastName | FirstName | Sex | +----------+-----------+------+ | Jones | Mary | F | +----------+-----------+------+
Die Spalten LastName
und Firstname
sind als Typ Varchar
deklariert . Dadurch können Namen so lang sein wie die Datentypdefinition. Aber für Namen, die kürzer als das angegebene Maximum sind, werden keine Leerzeichen an die Daten in diesen Spalten angehängt.
SQL-Datentyp für Datum und Uhrzeit
Die DATETIME
Der Datentyp wird verwendet, um die Datums- und Uhrzeitwerte in der Datenbank zu speichern. Werte für DATETIME
Datentyp verwenden vier Bytes Speicherplatz für den Datumsteil und vier Bytes für den Zeitteil. Der Zeitteil dieses Datentyps gibt die Zeit mit einer Granularität bis zur Anzahl von Millisekunden nach Mitternacht an. Die Genauigkeit für diesen Datentyp reicht von „1. Januar 1753“ bis „31. Dezember 9999“ mit einer Genauigkeit von 3,33 Millisekunden.
Hinweis Wenn Sie einem DATETIME
nur den Datumswert zuweisen Datentyp-Spalte oder -Variable, der Zeitteil ist standardmäßig Mitternacht.
Das folgende Beispiel demonstriert den DATETIME
Datentyp.
DELIMITER //
CREATE PROCEDURE Datetimedemo()
BEGIN
DECLARE BirthDate DATETIME
SET BirthDate = '1990-01-01 09:00:00'
SELECT BirthDate
END//
DELIMITER ;
call Datetimedemo;
Die Ausgabe sieht wie folgt aus:
+----------+-----------+
| BirthDate |
+----------+-----------+
| 1990-01-01 09:00:00 |
+----------+-----------+
Hinweis Einige SQL-Implementierungen unterstützen zusätzliche Datentypen, die entweder eine Teilmenge, eine Obermenge oder eine Variante aller oben angegebenen Datentypen sind.
Überlegungen zum SQL-Datentyp
Beim Entwerfen einer Datenbank ist es äußerst wichtig, geeignete Datentypen für Tabellenspalten und gespeicherte Prozedurvariablen sorgfältig auszuwählen.
Die getroffenen Entscheidungen können sich erheblich auf die Speichereffizienz und die Gesamtleistung der Datenbank auswirken. Ein einfaches Beispiel ist die Definition des Age
einer Person Spalte vom Typ Tinyint
sein Datentyp, im Gegensatz zu Int
Datentyp. Dies hat folgende Gründe:
- Wie bereits erwähnt,
Tinyint
Datentypen haben ¼ der Speicheranforderungen vonInt
Datentypen. - Die Abrufeffizienz eines
Tinyint
Spalte gegenüber einemInt
Spalte ist viel größer.
Oberflächlich betrachtet scheint dies kein großes Problem zu sein. Wenn die betroffene Tabelle jedoch Millionen von Zeilen enthält, können sicherlich sowohl Speicher- als auch Leistungseffizienz erreicht werden. Wenn Sie diese Entwurfskriterien auf eine gesamte Datenbank ausdehnen, können Sie diese Effizienzen um Größenordnungen generieren.
Wenn Sie die erforderliche Entwurfszeit für die Auswahl des Datenbankdatentyps aufwenden, kann dies möglicherweise die Notwendigkeit verringern, teure Typkonvertierungen in Abfragen und in der Logik gespeicherter Prozeduren durchzuführen, wenn Spalten verschiedener Datentypen verglichen werden.
Beispielsweise speichern Sie in einer Tabelle ein Datum in einem Varchar(20)
Spalte und in einer anderen Tabelle speichern Sie ein Datum in einem Datetime
Säule. Wenn Sie die beiden Spalten vergleichen müssen, müssen Sie eine Datentypkonvertierungsfunktion in einer Abfrage für eine der beiden Spalten verwenden. Dies ist eine teure Operation.
Schlussfolgerung
SQL-Datentypen sind die Attribute, die Datenbankspalten und -variablen zugeordnet sind. Diese Attribute können binär, numerisch, Zeichen und Datum/Uhrzeit sein. Es ist eine sorgfältige Entwurfszeit erforderlich, um sicherzustellen, dass Spalten und Variablen mit einem korrekten Datentyp definiert werden, um sowohl die Speicher- als auch die Abfrageausführungseffizienz sicherzustellen.