Der folgende Abschnitt ist vor allem für
DOUBLE
- und FLOAT
-Spalten
interessant, da Fließkommazahlen von Natur aus ungenau sind.
MySQL führt DECIMAL
-Operationen mit einer
Genauigkeit von 64 Dezimalstellen aus. Das müsste die meisten
Probleme im Hinblick auf die Genauigkeit von
DECIMAL
-Spalten lösen.
Fließkommazahlen stiften gelegentlich Verwirrung, da sie in
einer Computerarchitektur nicht als exakte Werte gespeichert
werden. Das, was der Bildschirm zeigt, ist in der Regel nicht
der genaue Wert der Zahl. Die Datentypen
FLOAT
und DOUBLE
sind
Fließkommatypen. DECIMAL
-Spalten speichern
Werte mit einer exakten Anzahl Stellen, weil sie als Strings
dargestellt werden.
Das folgende Beispiel verdeutlicht das Problem an einem
DOUBLE
:
mysql>CREATE TABLE t1 (i INT, d1 DOUBLE, d2 DOUBLE);
mysql>INSERT INTO t1 VALUES (1, 101.40, 21.40), (1, -80.00, 0.00),
->(2, 0.00, 0.00), (2, -13.20, 0.00), (2, 59.60, 46.40),
->(2, 30.40, 30.40), (3, 37.00, 7.40), (3, -29.60, 0.00),
->(4, 60.00, 15.40), (4, -10.60, 0.00), (4, -34.00, 0.00),
->(5, 33.00, 0.00), (5, -25.80, 0.00), (5, 0.00, 7.20),
->(6, 0.00, 0.00), (6, -51.40, 0.00);
mysql>SELECT i, SUM(d1) AS a, SUM(d2) AS b
->FROM t1 GROUP BY i HAVING a <> b;
+------+-------+------+ | i | a | b | +------+-------+------+ | 1 | 21.4 | 21.4 | | 2 | 76.8 | 76.8 | | 3 | 7.4 | 7.4 | | 4 | 15.4 | 15.4 | | 5 | 7.2 | 7.2 | | 6 | -51.4 | 0 | +------+-------+------+
Das Ergebnis ist richtig. Auch wenn die ersten fünf Datensätze
nicht so aussehen, als würden sie den Test bestehen (die Werte
von a
und b
sehen nicht
verschieden aus), können sie dennoch unterschiedlich sein, da
sie womöglich in der zehnten Nachkommastelle oder so (je nach
Computerarchitektur) eine Abweichung aufweisen.
Wären die Spalten d1
und
d2
als DECIMAL
statt als
DOUBLE
definiert, so hätte die
SELECT
-Anfrage nur eine einzige Zeile
geliefert, nämlich die letzte der obigen Tabelle.
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.