In Präzisionsberechnungen werden genaue Zahlen möglichst immer
so verwendet, wie sie angegeben sind. Beispielsweise werden Zahlen
in Vergleichsoperationen genau wie vorgegeben verwendet, ohne jede
Änderung. Im strikten SQL-Modus wird eine Zahl, die mit
INSERT
in eine Spalte mit einem genauen
Datentyp (DECIMAL
oder Integer) geladen wird,
mit ihrem genauen Wert eingefügt, wenn sie im Wertebereich der
Spalte liegt. Wird die Zahl abgerufen, ist ihr Wert immer noch
derselbe, der eingefügt wurde. (Ohne den Strict-Modus kann ein
Wert bei INSERT
-Operationen auch abgeschnitten
werden.)
Die Handhabung numerischer Ausdrücke hängt davon ab, welche Art von Werten die Ausdrücke enthalten:
Enthält ein Ausdruck Näherungswerte, so ist der gesamte Ausdruck eine Näherung und wird mit Fließkommaarithmetik ausgewertet.
Enthält der Ausdruck keine Näherungswerte, sind nur genaue
Werte vorhanden. Enthält irgendein genauer Wert einen
Bruchteilsanteil (also einen Wert, der hinter dem Dezimalpunkt
steht), so wird er mit genauer Arithmetik als
DECIMAL
ausgewertet und hat eine
Genauigkeit von 65 Stellen. (Was mit „genau“
gemeint ist, hängt von den Grenzen dessen ab, was im
Binärformat dargestellt werden kann. So kann beispielsweise
1.0/3.0
in Dezimalschreibweise als die
Näherung .333...
, aber nicht als genaue
Zahl dargestellt werden. Daher wird
(1.0/3.0)*3.0
nicht als genau
1.0
ausgewertet.)
Andernfalls enthält der Ausdruck nur Integer-Werte. Der
Ausdruck ist somit genau und wird mit Integer-Arithmetik
ausgewertet. Seine Genauigkeit ist dieselbe wie
BIGINT
(64 Bits).
Wenn ein numerischer Ausdruck Strings enthält, so werden diese in Fließkommawerte mit doppelter Genauigkeit umgewandelt und es entsteht ein näherungsweiser Ausdruck.
Einfügungen in numerische Spalten werden durch den SQL-Modus
beeinflusst, der mit der Systemvariablen
sql_mode
eingestellt wird. (Siehe
Abschnitt 1.9.2, „Auswahl der SQL-Modi“.) In den nachfolgenden Ausführungen
werden der Strict-Modus (der durch die Werte
STRICT_ALL_TABLES
oder
STRICT_TRANS_TABLES
eingeschaltet wird) und
ERROR_FOR_DIVISION_BY_ZERO
verwendet. Um alle
Restriktionen einzuschalten, können Sie auch einfach den
TRADITIONAL
-Modus wählen, der beide
Strict-Modi und ERROR_FOR_DIVISION_BY_ZERO
umfasst:
mysql> SET sql_mode='TRADITIONAL';
Wird eine Zahl in eine Spalte eines genauen Datentyps
(DECIMAL
oder Integer) eingefügt, so wird sie
mit ihrem genauen Wert in die Spalte geladen, wenn sie im
zulässigen Wertebereich dieser Spalte liegt.
Hat ihr Dezimalteil zu viele Stellen, wird sie gerundet und eine Warnung ausgegeben. Gerundet wird, wie es unter Rundungsverhalten beschrieben ist.
Hat die Zahl in ihrem ganzzahligen Teil zu viele Stellen, ist sie zu groß und wird folgendermaßen behandelt:
Wenn der Strict-Modus nicht eingeschaltet ist, wird der Wert auf den nächsten zulässigen Wert abgeschnitten und eine Warnung generiert.
Ist der Strict-Modus aktiviert, tritt ein Überlauffehler ein.
Da ein Speicherunterlauf nicht erkannt wird, ist die Behandlung eines Unterlaufs nicht definiert.
Nach Voreinstellung kommt bei einer Division durch null das
Ergebnis NULL
heraus und keine Warnung. Haben
Sie jedoch den SQL-Modus
ERROR_FOR_DIVISION_BY_ZERO
aktiviert, geht
MySQL mit einer Division durch null ganz anders um:
Wenn der Strict-Modus eingeschaltet ist, wird eine Warnung ausgegeben.
Bei eingeschaltetem Strict-Modus sind Einfügungen und Aktualisierungen, bei denen eine Division durch null vorkommt, verboten, und ein Fehler wird gemeldet.
Mit anderen Worten: Einfügungen und Aktualisierungen, in denen
Ausdrücke mit einer Division durch null vorkommen, können als
Fehler behandelt werden, allerdings nur dann, wenn zusätzlich zum
Strict-Modus ERROR_FOR_DIVISION_BY_ZERO
eingeschaltet ist.
Nehmen wir als Beispiel folgende Anweisung:
INSERT INTO t SET i = 1/0;
Nun sehen Sie, was bei unterschiedlichen Kombinationen von Strict
und ERROR_FOR_DIVISION_BY_ZERO
passiert:
sql_mode Wert |
Ergebnis |
'' (Default) |
Keine Warnung, kein Fehler; i wird auf
NULL gesetzt. |
strict | Keine Warnung, kein Fehler; i wird auf
NULL gesetzt. |
ERROR_FOR_DIVISION_BY_ZERO |
Warnung, aber kein Fehler; i wird auf
NULL gesetzt. |
strict,ERROR_FOR_DIVISION_BY_ZERO
|
Fehlerbedingung, keine Zeile eingefügt. |
Werden Strings in numerische Spalten eingefügt, findet folgende Zahlenkonvertierung statt, wenn der String keinen numerischen Inhalt hat:
Ein String, der nicht mit einer Zahl anfängt, kann nicht als Zahl verwendet werden. Im Strict-Modus wird ein Fehler und ansonsten eine Warnung generiert. Das schließt auch den leeren String ein.
Ein mit einer Zahl beginnender String kann konvertiert werden, wobei jedoch der nachfolgende, nichtnumerische Teil abgeschnitten wird. Wenn der abgeschnittene Teil etwas anderes als Leerzeichen enthält, wird im Strict-Modus ein Fehler und ansonsten eine Warnung generiert.
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.