In diesem Abschnitt werden die Merkmale des Datenyps
DECIMAL
(und seiner Synonyme) in MySQL
5.1 vorgestellt. Dabei werden besonders folgende
Themen angesprochen:
die Höchstzahl der Stellen
das Speicherformat
der Speicherbedarf
die nicht zum Standard gehörende MySQL-Erweiterung für den
oberen Bereich der DECIMAL
-Spalten
Auf mögliche Inkompatibilitäten mit Anwendungen, die für ältere Versionen von MySQL geschrieben wurden, weisen wir an geeigneter Stelle in diesem Abschnitt hin.
Die Deklarationssyntax für eine DECIMAL
-Spalte
lautet
DECIMAL(
.
Die Argumente haben in MySQL 5.1 folgende
Wertebereiche:
M
,D
)
M
ist die Höchstzahl der Stellen
(die Genauigkeit) und liegt zwischen 1 und 65. (Ältere
Versionen von MySQL hatten hier einen zulässigen Wertebereich
von 1 bis 254.)
D
ist die Anzahl der Stellen rechts
vom Dezimalpunkt (die Dezimalstellen) mit dem Wertebereich 0
bis 30. D
darf nicht größer als
M
sein.
Dass M
maximal 65 beträgt, führt
dazu, dass Berechnungen mit DECIMAL
-Werten auf
bis zu 65 Stellen genau sind. Da diese maximale Genauigkeit von 65
Stellen auch für genaue numerische Literale gilt, hat sich der
maximale Wertebereich solcher Literale geändert. (In älteren
MySQL-Versionen konnten Dezimalwerte bis zu 254 Stellen haben,
aber die Berechnungen wurden als Fließkommaoperationen
ausgeführt und waren daher Näherungen und nicht genau.)
Werte für DECIMAL
-Spalten werden in MySQL
5.1 in einem Binärformat gespeichert, das
Dezimalstellen in 4 Byte hineinpackt. Der Speicherbedarf für den
ganzzahligen Teil und den Bruchteil wird separat ermittelt. Ein
Vielfaches von 9 Stellen belegt 4 Byte und eventuelle Reststellen
belegen einen Bruchteil von 4 Byte. Da beispielsweise die Spalte
DECIMAL(18,9)
auf jeder Seite des Dezimalpunkts
9 Stellen hat, belegen ihr ganzzahliger und ihr Dezimalteil
jeweils 4 Byte. Eine DECIMAL(20,10)
-Spalte hat
dagegen auf jeder Seite des Dezimalpunkts 10 Stellen. Jeder Teil
belegt also 4 Byte für die ersten 9 Stellen und 1 Byte für die
Reststelle.
Folgende Tabelle zeigt den Speicherbedarf für Reststellen an:
Reststellen | Anzahl Bytes |
0 | 0 |
1 | 1 |
2 | 1 |
3 | 2 |
4 | 2 |
5 | 3 |
6 | 3 |
7 | 4 |
8 | 4 |
9 | 4 |
Im Gegensatz zu älteren Versionen von MySQL (vor 5.0.3) speichern
DECIMAL
-Spalten in MySQL 5.1 keine
Stelle für ein vorangestelltes +
-Zeichen oder
vorangestellte 0
-Ziffern. Wenn Sie
+0003.1
in eine
DECIMAL(5,1)
-Spalte speichern, so wird diese
Zahl einfach als 3.1
gespeichert. Anwendungen,
die das frühere Speicherverhalten benötigen, müssen
umgeschrieben werden, um sie an diese Änderung anzupassen.
DECIMAL
-Spalten können in MySQL
5.1 keine Werte speichern, die größer sind als in
der Spaltendefinition angegeben. So lässt beispielsweise eine
DECIMAL(3,0)
-Spalte Werte von
-999
bis 999
zu und eine
DECIMAL(
-Spalte
erlaubt höchstens M
,D
)M
–
D
Stellen auf der linken Seite des
Dezimalpunkts. Das ist nicht kompatibel mit Anwendungen, die sich
auf die älteren Versionen von MySQL stützen, welche eine
zusätzliche Stelle für das +
-Zeichen
speicherten.
Der SQL-Standard verlangt für
NUMERIC(
-Werte
eine Genauigkeit von exakt
M
,D
)M
Stellen und für
DECIMAL(
-Werte
eine Genauigkeit von mindestens M
,D
)M
Stellen (es darf auch mehr sein). In MySQL sind
DECIMAL(
und
M
,D
)NUMERIC(
dasselbe und haben beide eine Genauigkeit von exakt
M
,D
)M
Stellen.
Genauere Informationen über die Portierung von Anwendungen, die
sich auf die frühere Behandlung des Datentyps
DECIMAL
stützen, finden Sie unter
MySQL-Referenzhandbuch für die Version
5.0.
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.