Der Typ »DOUBLE« in SQL (MySQL) (Der Typ »DOUBLE« in SQL (MySQL)), Lektion, Seite 724230
https://www.purl.org/stefan_ram/pub/double_sql (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
SQL-Kurs

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

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram724230 stefan_ram:724230 Der Typ »DOUBLE« in SQL (MySQL) Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd724230, slrprddef724230, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/double_sql