Der Typ »DOUBLE« in SQL (MySQL)
Aktuelle Anmerkung von 2020 Der zweite Wert in den Klammern (wie bei »DOUBLE( 4, 2 )«) ist inzwischen veraltet.
DOUBLE
Der Datentyp »DOUBLE« umfaßt Zahlen mit zirka 14 Stellen (einschließlich Nachkommastellen) aus einem großen Wertebereich. Da diese Zahlen intern im Binärsystem dargestellt werden können viele im Alltag vorkommende Zahlen, wie ‹ 0,1 › (ein Zehntel) nicht mehr genau dargestellt werden, was dann zu Abweichungen führen kann, die zwar nur klein sind, aber das optische Erscheinungsbild eines Wertes stark verändern können. Beispielsweise könnte »1.9999999999999999« statt »2« erscheinen. Daher ist dieser Datentyp für Anwendungen, bei denen es auf das Erscheinungsbild und genaue Verarbeitung von Alltagszahlen wie ‹ 0,1 › (ein Zehntel) ankommt, nur mit zusätzlichen Maßnahmen geeignet. Für technische Anwendungen ist dieser Datentyp aber beliebt, da dort die winzigen Abweichungen nicht stören und DOUBLE-Werte mit vergleichbarer Genauigkeite weniger Speicherplatz verlangen und schneller verarbeitet werden als DECIMAL-Werte.
DOUBLE ( 9, 2 )
Gelegentlich findet man auch beim Typ »DOUBLE« noch eine nachgestellte Angabe zweier Zahlenwerte. Diese Zahlen sind Informationen über eine Festlegung dafür, wie viele Zeichen breit das Feld sein soll und wie viele Nachkommastellen der Wert haben soll. Falls solche Begrenzungen der Feldbreite und der Anzahl von Nachkommastellen für eine Spalten festgelegt werden und dann ein Wert eingefügt wird, wird der Wert beim Einfügen entsprechend der Beschränkungen angepaßt. So wird aus der Zahl »123« beim Einfügen in ein Feld mit dem Typ »DOUBLE ( 2, 0 )« der Wert »99«. Hierin unterscheidet sich »DOUBLE« von »INT«, wo der Wert in den Klammern sich nicht in dieser Weise auswirkt. Bei Verwendung eines der Modi »STRICT_ALL_TABLES« oder »ANSI« gibt es beim Versuch des Einfügens der Zahl »123« in ein Feld mit dem Typ »DOUBLE ( 2, 0 )« allerdings eine Fehlermeldung, ist kein besonderer Modus aktiv, gibt es nur eine Warnungsmeldung.
Der Typ »DOUBLE« ist besonders für Meßwerte kontinuierlicher Größen, wie Temperatur in Kelvin, Länge in Meter oder Zeitdauer in Sekunden, geeignet. Für Währungsbeträge sollte »DECIMAL« bevorzugt werden. Allerdings könnte »DOUBLE« in speziellen Fällen und unter Verwendung zusätzlichen Programmieraufwands auch für ganze Zahlen oder Währungsbeträge verwendet werden. Dies kann manchmal schneller und platzsparend. Jedoch ist das Risiko von Programmierfehlern dabei größer, so daß dies schwieriger ist.
DOUBLE-Numeralia
Wenn ein Numerale mit »E0« abgeschlossen wird, so hat es den Typ »DOUBLE«.
Numeralia, die ein »E« enthalten, werden als DOUBLE-Werte dargestellt. Das E kann klein geschrieben werden; zur Kompatibilität mit möglichst vielen Datenbanksystemen wird Großschreibung empfohlen. Ein solches Numerale mit »E« (oder »e«) hat den Datentyp »double«, selbst wenn es keinen Punkt enthält.
Numeral Wert Typ
0e0 0 DOUBLE
0E0 0 DOUBLE
1E0 1 DOUBLE
1.1E0 1.1 DOUBLE
Das folgende Transkript zeigt die Verwendung von DOUBLE-Numeralia in einer einfachen Abfrage.
- Konsole
SELECT 0e0, 0E0, -0E0, 1E0, 1.1E0;
+-----+-----+------+-----+-------+
| 0e0 | 0E0 | -0E0 | 1E0 | 1.1E0 |
+-----+-----+------+-----+-------+
| 0 | 0 | -0 | 1 | 1.1 |
+-----+-----+------+-----+-------+
In einem solchen Numerale steht »E« für „mal Zehn hoch“. »2E3« bedeutet also beispielsweise ‹ 2 × 10³ ›.
‹ 10³ › bezeichnet den Wert, den man erhält, wenn man die Zahl Eins drei Mal mit ‹ 10 › multipliziert. Allgemein bezeichnet für eine natürliche Zahl n der Term ‹ 10ⁿ › den Wert, den man erhält, wenn man die Zahl Eins n -mal mit 10 multipliziert.
Dies bedeutet, daß das Dezimalkomma bei »2.0« um drei Schritte nach rechts verschoben werden soll. Man erhält so »2000.0«.
»2E3« bedeutet also nicht etwa „2³“, also die Zahl, welche man erhält indem man die Zahl Eins dreimal mit der Zahl 2 multipliziert (8).
Numerale Wert Typ
2E3 2000 DOUBLE
- Konsole
SELECT 2E3;
+------+
| 2E3 |
+------+
| 2000 |
+------+
Die ausgegebene Tabelle zeigt wieder den Unterschied zwischen dem als Spaltentitel verwendeten Numerale »2E3« und der Wertdarstellung »2000« darunter.
Entsprechend bedeutet »2E0« ‹ 2 × 10º ›, also das Zweifache der Zahl, die man erhält indem man die Zahl Eins kein Mal mit ‹ 10 › multipliziert. Wenn man die Zahl eins kein Mal mit ‹ 10 › multipliziert, bleibt sie unverändet. Daher ist ‹ 10º › gleich ‹ 1 › und ‹ 2 × 10º › gleich ‹ 2 ›. Also bedeutet »2E0« ‹ 2 ›.
- Konsole
SELECT 2E0;
+-----+
| 2E0 |
+-----+
| 2 |
+-----+Numerale Wert Typ
2E0 2 DOUBLE
2E1 20 DOUBLE
2E2 200 DOUBLE
2E-0 2 DOUBLE
2E-1 0.2 DOUBLE
2E-2 0.02 DOUBLE
Schließlich bedeutet »2E-n « für ein positives ganzzahliges Numerale »n « ‹ 2 ÷ 10ⁿ ›, so bedeutet »2E-1« beispielsweise ‹ 2 ÷ 10¹ ›, also ‹ 2 ÷ 10 ›, also »0.2«.
Das folgende Transkript zeigt, wie die Angabe einer Feldbreite und Anzahl von Nachkommastellen, die Speicherung von Werten vom Typ »DOUBLE« beeinflußt. Die Werte werden wie angezeigt in der Tabelle gespeichert, die Informationen über die genauen Werte sind also durch das Einfügen unwiderruflich verlorengegangen.
- Konsole
CREATE TABLE T ( S DOUBLE ( 4, 2 ) );
INSERT INTO T VALUES ( 1.2e0 );
INSERT INTO T VALUES ( 1.2e0 );
INSERT INTO T VALUES ( 1.2e0 );
SELECT * FROM T;+-------+
| S |
+-------+
| 1.20 |
| 1.23 |
| 99.99 |
+-------+
Zusammenfassend kann man sagen, daß beim Einfügen von Werten in Spalten die Typen der für die Angabe der Werte verwendeten Literale weniger wichtig sind als die Typen der Spalten, da die Typen der Werte bei Einfügen immer in die Typen der Spalten umgewandelt werden. Um Mißverständnisse und Fehler bei der Umwandlung zu vermeiden, ist es allerdings empfehlenswert, für die Literale möglichst einen Typ desselben Namens zu wählen, wie den Typ der Spalte, in die eingefügt werden soll.
Bei der Verwendung von DOUBLE-Literalen wird als Typ nur »DOUBLE« ohne Berücksichtigung einer bestimmten Zahl von Nachkommastellen festgelegt. Deswegen werden – anders als bei »DECIMAL« – hinter dem Dezimaltrennzeichen keine Endnullen ausgegeben.
- Konsole
SELECT 1.10;
+------+
| 1.10 |
+------+
| 1.10 |
+------+SELECT 1.10e0;
+--------+
| 1.10e0 |
+--------+
| 1.1 |
+--------+- Konsole
SELECT 2E0;
+-----+
| 2E0 |
+-----+
| 2 |
+-----+- zusammenfassende Übersicht
Numerale Typ
2 INTEGER
2.0 DECIMAL ( 2, 1 )
2.0e0 DOUBLE
Quellen *
- Übersicht der numerischen Typen
http://dev.mysql.com/doc/en/numeric-type-overview.html