MySQL unterstützt alle im SQL-Standard vorgesehen numerischen
Datentypen. Hierzu gehören exakte numerische Datentypen
(INTEGER
, SMALLINT
,
DECIMAL
und NUMERIC
) ebenso
wie annähernde Typen (FLOAT
,
REAL
und DOUBLE PRECISION
).
Das Schlüsselwort INT
ist ein Synonym für
INTEGER
, und das Schlüsselwort
DEC
ist ein Synonym für
DECIMAL
. Informationen zu den
Speicheranforderungen numerischer Typen finden Sie in
Abschnitt 11.5, „Speicherbedarf von Spaltentypen“.
Der Datentyp BIT
speichert Bitfeldwerte und
wird für MyISAM
-, MEMORY
-,
InnoDB
- und BDB
-Tabellen
unterstützt.
In Erweiterung des SQL-Standards unterstützt MySQL auch die
Integer-Typen TINYINT
,
MEDIUMINT
und BIGINT
. Die
folgende Tabelle zeigt den erforderlichen Speicherplatz und den
zulässigen Wertebereich der Integer-Typen.
Typ | Bytes | Minimum | Maximum |
(vorzeichenbehaftet/vorzeichenlos) | (vorzeichenbehaftet/vorzeichenlos) | ||
TINYINT |
1 | -128 |
127 |
0 |
255 |
||
SMALLINT |
2 | -32768 |
32767 |
0 |
65535 |
||
MEDIUMINT |
3 | -8388608 |
8388607 |
0 |
16777215 |
||
INT |
4 | -2147483648 |
2147483647 |
0 |
4294967295 |
||
BIGINT |
8 | -9223372036854775808 |
9223372036854775807 |
0 |
18446744073709551615 |
Eine andere Erweiterung wird von MySQL zur optionalen
Spezifizierung der Anzeigebreite eines Integer-Werts unterstützt.
Die Angabe erfolgt auf das Schlüsselwort für den Datentyp
folgend in Klammern (z. B. INT(4)
). Diese
optionale Angabe der Anzeigebreite wird verwendet, um die Anzeige
von Werten, die eine geringere als die für die Spalte festgelegte
Breite aufweisen, nach links mit Leerzeichen aufzufüllen.
Die Anzeigebreite schränkt weder die in einer Spalte speicherbaren Wertebereiche noch die Anzahl der Stellen ein, die für Werte angezeigt werden, deren Breite die festgelegte Spaltenbreite überschreitet.
Wenn hierzu das optionale Erweiterungsattribut
ZEROFILL
verwendet wird, erfolgt ein Auffüllen
nicht mehr mit Leerzeichen, sondern mit Nullen. Bei einer Spalte
etwa, die als INT(5) ZEROFILL
deklariert ist,
wird der Wert 4
als 00004
abgerufen. Beachten Sie, dass, wenn Sie Werte in einer
Integer-Spalte speichern, die größer sind als die Anzeigebreite,
unter Umständen Probleme auftauchen, wenn MySQL Temporärtabellen
für einige komplizierte Joins anlegt, denn in diesen Fällen
setzt MySQL voraus, dass die Daten in die ursprüngliche
Spaltenbreite passen.
Für alle Integer-Typen gibt es das (nicht standardkonforme)
Attribut UNSIGNED
. Vorzeichenlose Werte können
verwendet werden, wenn in einer Spalte nur nichtnegative Zahlen
zulässig sind und Sie für die Spalte einen nach oben erweiterten
numerischen Wertebereich benötigen. Wenn beispielsweise eine
INT
-Spalte als UNSIGNED
deklariert wird, ist die Spaltengröße gleich; zulässige Werte
entstammen nun aber nicht mehr dem Bereich zwischen
-2147483648
und 2147483647
,
sondern dem Bereich zwischen 0
und
4294967295
.
Auch Fließkommazahlen und Festkommazahlen können vorzeichenlos sein. Wie bei Integer-Typen verhindert dieses Attribut die Speicherung negativer Werte in der Spalte. Anders als bei jenen aber bleibt das Maximum für die Spaltenwerte unverändert.
Wenn Sie ZEROFILL
für eine numerische Spalte
angeben, fügt MySQL automatisch das Attribut
UNSIGNED
für die Spalte hinzu.
Bei Fließkommadatentypen verwendet MySQL 4 Byte für Werte einfacher und 8 Byte für Werte doppelter Genauigkeit.
Die Datentypen FLOAT
und
DOUBLE
werden zur Darstellung annähernder
numerischer Datenwerte verwendet. Für FLOAT
gestattet der SQL-Standard optional die Angabe der Genauigkeit
(nicht aber des Bereichs des Exponenten) in Bits, die dem
Schlüsselwort FLOAT
in Klammern folgen. Auch
MySQL unterstützt diese optionale Genauigkeitsangabe, der
Genauigkeitswert wird allerdings nur zur Bestimmung der
Speichergröße verwendet. Eine Genauigkeit von 0 bis 23 hat eine
vier Byte lange FLOAT
-Spalte mit einfacher
Genauigkeit zum Ergebnis. Bei einer Genauigkeit von 24 bis 53
entsteht eine acht Byte lange DOUBLE
-Spalte mit
doppelter Genauigkeit.
MySQL gestattet eine nicht standardkonforme Syntax:
FLOAT(
oder
M
,D
)REAL(
oder M
,D
)DOUBLE
PRECISION(
.
Hierbei bedeutet
„M
,D
)(
“,
dass Werte mit bis zu M
,D
)M
Stellen
insgesamt angezeigt werden, wovon D
Nachkommastellen sind. Beispielsweise erscheint eine Spalte, die
als FLOAT(7,4)
definiert wurde, in der Anzeige
als -999.9999
. MySQL führt die Rundung beim
Speichern der Werte durch, d. h. wenn Sie
999.00009
in einer
FLOAT(7,4)
-Spalte einfügen, ist das Ergebnis
näherungsweise 999.0001
.
MySQL behandelt DOUBLE
als Synonym für
DOUBLE PRECISION
(dies ist eine nicht
standardkonforme Erweiterung). Ferner behandelt MySQL
REAL
als Synonym für DOUBLE
PRECISION
(nicht standardkonforme Variante), sofern der
SQL-Modus REAL_AS_FLOAT
nicht aktiviert ist.
Wenn Sie maximale Portabilität benötigen, sollten Sie in Code,
in dem die Speicherung annähernder numerischer Datenwerte
erforderlich ist, FLOAT
oder DOUBLE
PRECISION
ohne Angabe der Genauigkeit oder der Stellen
verwenden.
Die Datentypen DECIMAL
und
NUMERIC
werden zur Speicherung exakter
numerischer Datenwerte verwendet. In MySQL ist
NUMERIC
als DECIMAL
implementiert. Diese Typen werden zur Speicherung von Werten
benutzt, bei denen die Beibehaltung der exakten Genauigkeit
entscheidend ist (z. B. bei Finanzberechnungen).
MySQL 5.1 speichert DECIMAL
- und
NUMERIC
-Werte im binären Format. In älteren
Versionen erfolgte die Speicherung als Strings. Siehe auch
Kapitel 23, Präzisionsberechnungen.
Wenn Sie eine DECIMAL
- oder
NUMERIC
-Spalte deklarieren, können (und
sollten) Genauigkeit und Anzahl der Nachkommastellen angegeben
werden. Zum Beispiel:
salary DECIMAL(5,2)
In diesem Beispiel ist 5
die Genauigkeit und
2
die Anzahl der Nachkommastellen. Die
Genauigkeit stellt die Anzahl der signifikanten Stellen dar, die
für Werte gespeichert werden. Ist für die Nachkommastellen 0
festgelegt, dann haben DECIMAL
- und
NUMERIC
-Werte keinen Dezimalpunkt und keine
Nachkommastellen.
Der SQL-Standard erfordert, dass die Spalte
salary
jeden Wert mit fünf Stellen und zwei
Nachkommastellen speichern können muss. Dies bedeutet also, dass
der in der Spalte salary
speicherbare
Wertebereich zwischen -999.99
und
999.99
liegt.
Beim SQL-Standard ist die Syntax
DECIMAL(
gleichbedeutend mit
M
)DECIMAL(
.
Ähnlich hat die Syntax M
,0)DECIMAL
die gleiche
Bedeutung wie
DECIMAL(
, wobei
der Implementierung die Entscheidung zum Wert von
M
,0)M
überlassen bleibt. MySQL
unterstützt diese beiden Varianten der
DECIMAL
- und NUMERIC
-Syntax.
Der Vorgabewert von M
ist 10.
Die maximale Anzahl von Stellen für DECIMAL
oder NUMERIC
beträgt 65, der tatsächliche
Bereich für eine gegebene DECIMAL
- oder
NUMERIC
-Spalte kann jedoch durch die Angaben
für Genauigkeit oder Nachkommastellen eingeschränkt werden. Wenn
einer solchen Spalte ein Wert mit mehr Nachkommastellen als
zulässig zugewiesen wird, dann wird der Wert der zulässigen
Anzahl Nachkommastellen angepasst. (Das exakte Verhalten ist
betriebssystemspezifisch, aber in der Regel werden überzählige
Nachkommastellen einfach abgeschnitten.)
Der Datentyp BIT
wird zur Speicherung von
Bitfeldwerten verwendet. Der Typ
BIT(
gestattet die
Speicherung von M
)M
-Bit-Werten. Dabei
kann M
in einem Bereich zwischen 1 und
64 liegen.
Zur Angabe von Bitwerten kann die Notation
b'
verwendet
werden. value
'value
ist ein Binärwert, der
aus Einsen und Nullen besteht. So stehen etwa
b'111'
und b'100000000'
für
die Zahlen 7 bzw. 128. Siehe auch
Abschnitt 9.1.5, „Bitfeldwerte“.
Wenn Sie einer
BIT(
-Spalte einen
Wert zuweisen, der weniger als M
)M
Bits
lang ist, dann wird der Wert nach links mit Nullen aufgefüllt. So
entspricht die Zuweisung des Werts b'101'
an
eine Spalte BIT(6)
im Endeffekt der Zuweisung
von b'000101'
.
Wenn MySQL einen Wert in einer numerischen Spalte speichern soll,
der außerhalb des für den Datentyp zulässigen Bereichs liegt,
dann hängt das Verhalten von MySQL von dem zum betreffenden
Zeitpunkt aktiven SQL-Modus ab. Wenn etwa keine restriktiven Modi
aktiviert sind, setzt MySQL den Wert auf den jeweiligen Endwert
des Bereichs und speichert dann diesen Wert. Wenn als Modus jedoch
TRADITIONAL
aktiviert ist, weist MySQL einen
Wert außerhalb des Bereichs mit einer Fehlermeldung ab. In diesem
Fall schlägt die Einfügeoperation fehl – ganz so, wie es der
SQL-Standard vorsieht.
Wird im nichtstrikten Modus einer Integer-Spalte ein Wert
außerhalb des zulässigen Bereichs zugewiesen, dann speichert
MySQL den Wert, der dem entsprechenden Endpunkt für den Datentyp
der Spalte entspricht. Speichern Sie also etwa 256 in einer
TINYINT
- oder TINYINT
UNSIGNED
-Spalte, dann speichert MySQL 255 bzw. 127. Wird
einer Fließkomma- oder Festkommaspalte ein Wert außerhalb des
durch die angegebene (oder vorgabeseitige) Genauigkeit und
Nachkommastellenanzahl festgelegten Bereichs zugewiesen, dann
speichert MySQL ebenfalls den für diesen Bereich vorgesehenen
Endpunkt:
Konvertierungen, die aufgrund von Kürzungsoperationen
stattfinden, wenn MySQL nicht im strikten Modus läuft, werden als
Warnungen für ALTER TABLE
-, LOAD DATA
INFILE
- und UPDATE
-Anweisungen sowie
INSERT
-Anweisungen für mehrere Datensätze
gemeldet. Wenn MySQL im strikten Modus ausgeführt wird, schlagen
diese Anweisungen fehl, und einige oder alle Werte werden nicht
eingefügt bzw. geändert (dies hängt davon, ob die Tabelle
transaktionssicher ist, sowie von weiteren Faktoren ab).
Detaillierte Informationen finden Sie in
Abschnitt 5.2.5, „Der SQL-Modus des Servers“.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.