Dubioses Verhalten bei MySQL mit UNSIGNED-Feldern

Markus Zierhut gefällt dieser Artikel

Ich musste in letzter Zeit immer wieder feststellen, dass uns MySQL teilweise statt 0 den maximal möglichen (oder einen etwas kleineren) Wert für eine Spalte (UNSIGNED BIGINT = 18446744073709551615) bei einem UPDATE speichert.

Ich vermutete, dass es an einem Fehler in der benutzten Datenbank-Bibliothek (ADOdb für PHP), den SQL-Statements oder direkt bei MySQL liegt. Eine relativ lange (und ernüchternde) Fehlersuche brachte aber vorerst kein Ergebnis.

Nach der freitäglichen Currywurst in der Kantine kam ich dem Problem dann doch noch auf die Spur und ich wünsche mir für die Zukunft, dass Banken doch auch MySQL und UNSIGNED-Felder für meinen Kontostand nutzen sollten:

Es liegt am Verhalten von MySQL bei UNSIGNED-Feldern: Das Feld war ein UNSIGNED BIGINT und hatte wohl als aktuellen Wert 0. Nachdem nun in der Anwendung von diesem Ausgangswert (0!) ein beliebiger Wert (>0) abgezogen werden sollte, zieht MySQL diesen Wert vom Maximalwert des UNSIGNED BIGINT-Feldes (auch UNSIGNED INT-Felder waren im Test betroffen) ab.

Interessanterweise ist dies nur auf dem Weg „nach unten“ so, beim Hochzählen des Feldinhalts bleibt er auf dem Maximum stehen. Bei „normalen“ BIGINT– oder INT-Feldern ist dieses Verhalten übrigens nicht gegeben.

P.S.: Der Fehler ließ sich sowohl auf MySQL 5.1.45 als auch 5.1.51 reproduzieren.

Ähnliche Beiträge:

Über Markus Zierhut

Life Is What You Make It!
Dieser Beitrag wurde unter PHP, SQL abgelegt und mit , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

2 Kommentare zu Dubioses Verhalten bei MySQL mit UNSIGNED-Feldern

  1. Lorenz sagt:

    Siehe http://bugs.mysql.com/bug.php?id=46799. Hier wird allerdings darauf verwiesen, dass es sich um keinen Bug im eigentlichen Sinne handelt.

    Das Verhalten bei einer Subtraktion mit UNSIGNED Werten lässt sich beeinflussen: http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html unter „NO_UNSIGNED_SUBTRACTION“. Wobei das nur etwas bringt, wenn das Ergebnis nicht wieder in eine UNSIGNED-Spalte geschrieben wird.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.