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.
2 Antworten zu Dubioses Verhalten bei MySQL mit UNSIGNED-Feldern