Dubioses Verhalten bei MySQL mit UNSIGNED-Feldern

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.

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

Schreibe einen Kommentar

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.