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

Der Typ »DECIMAL« in SQL (MySQL)

DECIMAL ( 9, 2 )

Der Datentyp »DECIMAL ( 9, 2 )« umfaßt Werte mit einem Vorzeichen, 7 Vorkommastellen und 2 Nachkommastellen – also insgesamt 9 Stellen. Mit den sieben Stellen vor dem Dezimaltrennzeichen können Zahlen bis zu zirka 9 Millionen  mit zwei Nachkommastellen dargestellt werden.

DECIMAL ( 5, 4 )

Gelegentlich werden wir dem Datentypnamen »DECIMAL« im weiteren Verlauf des Kurses auch mit anderen Werten in den Klammern begegnen, wie beispielsweise »DECIMAL ( 5, 4 )«. Die erste Zahl gibt dann immer die gesamte Anzahl der Stellen an, und die zweite Zahl die Anzahl der Nachkommastellen. »DECIMAL ( 5, 4 )« ist also ein Typ mit 5 Stellen, wovon 4 Stellen Nachkommastellen sind. Zur Vereinfachung können wir uns aber beim Anlegen von Tabellen bis auf weiteres auf »DECIMAL ( 9, 2 )« einschränken.

Ander als beim Typ »INT ( 4 )« haben  beim Typ »DECIMAL ( 5, 4 )« die Zahlen in den Klammern also einen Einfluß auf den Bereich der mit diesem Typ darstellbaren Werte!

»DECIMAL« kann auch ohne Klammern verwendet werden und bedeutet dann »DECIMAL ( 10, 0 )«. Wenn hier im Kurs »DECIMAL« ohne Werte in Klammern verwendet wird, dann ist damit aber irgendein Datentyp gemeint, der mit »DECIMAL« beginnt, wenn die genauen Werte in den Klammern unwichtig sind.

»DECIMAL« kann auch mit nur einer Zahl in den Klammern verwendet werden. »DECIMAL ( 22 )« bedeutet »DECIMAL ( 22, 0 )«.

DECIMAL ( 65, 30 )

Der Datentyp »DECIMAL ( 65, 30 )« umfaßt Werte mit einem Vorzeichen, 35 Vorkommastellen und 30 Nachkommastellen – also insgesamt 65 Stellen. Er verwendete für beide Typargumente das Maximum des Möglichen.

Kriterien

Falls für ein Feld nur eine ganze Zahl als Wert in Frage kommt, für die der INT-Wertebereich ausreichend ist, dann sollte der Typ »INT« verwendet werden.

Falls für ein Feld nur eine Zahl als Wert in Frage kommt, für die ein DECIMAL-Wertebereich ausreichend ist, aber der INT-Wertebereich nicht, dann sollte der Typ »DECIMAL« verwendet werden.

Falls auch der DECIMAL-Wertebereich nicht ausreichend ist oder Text abgespeichert werden soll, so kann ein mit VARCHAR-Typ verwendet werden.

Im allgemeinen sollte immer der Typ gewählt werden, der zur Bedeutung eines Feldes paßt. Bei einem Feld für einen ganzzahligen Wert, also beispielsweise der Typ »INT«. Bei einem Feld für Währungsbeträge mit zwei Nachkommastellen, »DECIMAL ( 9, 2 )«. Bei einem Feld für einen Text, »VARCHAR«.

Falls es dann immer noch mehrere mögliche Typen gibt, sollte der speziellste Typ (der Typ mit dem kleinsten Wertebereich) gewählt werden, der gerade alle möglichen Werte noch aufnehmen kann. Dadurch kann die Eingabe sinnloser Werte verhindert werden.

Beispiel

Zur Illustration legen wir hier eine Tabelle mit den drei Datentypen »INT«, »DECIMAL ( 9, 2 )« und »VARCHAR ( 255 )« an.

Vorbereitung
SET sql_mode = 'ANSI,TRADITIONAL';
DROP SCHEMA IF EXISTS S; CREATE SCHEMA S; USE S;

Query OK, 1 row affected (2.82 sec)

Query OK, 1 row affected (0.04 sec)

Database changed

Anlegen einer Tabelle
CREATE TABLE BUCHUNG ( NUMMER INT, BETRAG DECIMAL ( 9, 2 ), BEZEICHNUNG VARCHAR ( 255 ) );
Query OK, 0 rows affected (0.87 sec)

Wir fügen passende Daten ein.

Einfügen von Zeilen mit passenden Daten
INSERT INTO BUCHUNG ( NUMMER, BETRAG, BEZEICHNUNG ) VALUES 
( 0, 1234567.89, 'ZAHLUNGSEINGANG' );
Query OK, 1 row affected (0.16 sec)

Werden Daten in eine Spalte eingefügt, die eigentlich nicht mehr passend  sind, so wird dies von MySQL  oft ohne Meldung toleriert. Die nicht passenden Angaben werden dann entsprechend uminterpretiert. Da die Uminterpretation aber zu Mißinterpretationen und Problemen führen kann, wird empfohlen, für Felder möglichst gleich Angaben mit einem passendem Typ zu machen (wie eben gezeigt).

In dem folgenden Beispiel hat das Literal »1« den Datentyp »INT ( 1 )«, das Literal »1.0« hat den Datentyp »DECIMAL ( 2.1 )«, und das Literal »'1.0'« hat den Datentyp »VARCHAR ( 3 )«.

Einfügen von Zeilen mit nicht-passenden Daten – ohne Fehlermeldung
INSERT INTO BUCHUNG ( NUMMER, BETRAG, BEZEICHNUNG ) VALUES ( 1, 1, 1 );
Query OK, 1 row affected (0.13 sec)
INSERT INTO BUCHUNG ( NUMMER, BETRAG, BEZEICHNUNG ) VALUES ( 1.0, 1.0, 1.0 );
Query OK, 1 row affected (0.15 sec)
INSERT INTO BUCHUNG ( NUMMER, BETRAG, BEZEICHNUNG ) VALUES ( '1.0', '1.0', '1.0' );
Query OK, 1 row affected (0.03 sec)

Erst wenn Daten eingefügt werden, die von MySQL  nicht mehr uminterpretiert werden können, erscheint eine Fehlermeldung.

Einfügen von Zeilen mit nicht-passenden Daten – mit Fehlermeldung

INSERT INTO BUCHUNG ( NUMMER, BETRAG, BEZEICHNUNG ) VALUES ( 'abc', 'abc', 'abc' );

ERROR 1366 (HY000): Incorrect integer value: 'abc' for column 'NUMMER' at row 1

Die Ausgabe der Tabelle zeigt, wie die Daten interpretiert wurden.

Ausgabe der Tabelle
SELECT * FROM BUCHUNG;
+--------+------------+-----------------+
| NUMMER | BETRAG | BEZEICHNUNG |
+--------+------------+-----------------+
| 0 | 1234567.89 | ZAHLUNGSEINGANG |
| 1 | 1.00 | 1 |
| 1 | 1.00 | 1.0 |
| 1 | 1.00 | 1.0 |
+--------+------------+-----------------+

Man beachte, wie der gewählte Datentyp die Formatierung  der Ausgabe beeinflußt. Zahlen erscheinen rechtsbündig, Texte linksbündig, bei »DECIMAL ( 9, 2 )« werden immer alle Nachkommastellen angezeigt.

SQL  wird oft eingebettet in ein Anwendungsprogramm benutzt, so daß die für einen Endbenutzer sichtbare Formatierung dann oft erst durch dieses Anwendungsprogramm festgelegt wird. Spaltentypen sollten also nicht gewählt werden, um eine bestimmte Formatierung zu erhalten, sondern nur, um den Inhalt einer Spalte richtig darzustellen. Die Formatierung kann immer noch nachträglich festgelegt werden.

Typen von Literalen: DECIMAL-Numeralia

Bei Rechnungen mit Literalen können die Typen der Literale das Ergebnis der Rechnung beeinflussen. Deswegen ist es hilfreich zu wissen, welchen Typ Literale überhaupt haben.

Numeralia, die einen Punkt (aber kein E) enthalten, oder einen sehr großen Wert haben, werden als DECIMAL-Werte dargestellt.

Numeralia mit einem Punkt
123.     DECIMAL ( 3, 0 )
12.3 DECIMAL ( 3, 1 )
1.23 DECIMAL ( 3, 2 )
.123 DECIMAL ( 3, 3 )
123.0 DECIMAL ( 4, 1 )
0.123 DECIMAL ( 4, 3 )
123.45 DECIMAL ( 5, 2 )
0.0123 DECIMAL ( 5, 4 )
Numeralia mit sehr großem Wert
999999999999999999999999999999   DECIMAL ( 30, 0 )

Spalten- und Literaltypen

MySQL ist tolerant, wenn versucht wird einen Wert, dessen Typ sich vom Typ einer Spalte unterscheidet, in jene Spalte einzufügen oder ihn mit einem Wert aus jener Spalte zu vergleichen. MySQL versucht dann, den Wert entsprechend als einen Wert des Spaltentyps umzuinterpretieren. Jedoch kann dies zum Einfügen von Werten führen, die sich von den beabsichtigten Werten unterscheiden, oder Abfragen können verlangsamt werden. Deswegen ist es am besten, wenn solche Typunterschiede vermieden werden. Es ist weniger wichtig, daß Angaben in Klammern (wie bei »DECIMAL( 3, 1)«) übereinstimmen, aber der Name des Typs vor den Klammern sollte übereinstimmen.

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 stefanram724229 stefan_ram:724229 Der Typ »DECIMAL« in SQL (MySQL) Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd724229, slrprddef724229, 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/decimal_sql