neunzehn83.de

Ein Mann, ein Blog, kein Plan.

MySQLs BIGINT .. und PHP

Übrigens: Ein MySQL BIGINT ist 8 Byte lang. Unsigned lassen sich also Ganzzahlen von 0 bis 18446744073709551615 speichern. Eine MySQL-BIGINT-Spalte mit auto_increment läuft bei 1000 Inserts pro Sekunde erst nach über 500 Milliarden Jahren über. An dieser Stelle darf der Vergleich mit dem Alter des Universums natürlich nicht fehlen: lächerliche 13,75 Milliarden Jahre!

Die Länge eines PHP-Integers ist dagegen von der Plattform abhängig.  Der maximale Wert ist in der Konstanten PHP_INT_MAX hinterlegt. PHP-Integers sind immer signed.

echo PHP_INT_MAX; // "2147483647" auf einem 32bit System/32bit PHP
echo PHP_INT_MAX+1; // "2147483648" .. Nanu?

Wird INT_MAX überschritten gibt PHP immer ein float zurück

echo typeof(PHP_INT_MAX+1); // double
echo (int)(PHP_INT_MAX+1); // "-2147483648" Aha!

Wie wir sehen, ist ein PHP-Float eigentlich ein DOUBLE, also doppelte Genauigkeit (double precision) mit 8 Byte Länge.

52 der 64 bits werden für die Mantisse verwendet. Ganzzahlen können also bis 2^53-1 exakt abgespeichert werden. Darüber hinaus wird es ungenau:

ini_set('precision', 17);

// 2^53
echo 9007199254740991; // "9007199254740991"
// 2^54
echo 18014398509481983; // "18014398509481984"

Zugegeben, das Ganze ist etwas sehr theoretisch. Für das Rechnen mit wirklich große Zahlen verwendet man besser BCMath. Ein MySQL BIGINT ist auf 64bit Systemen mit 64bit PHP kein Problem. Auf 32bit Systemen wird's ab 2^53 haarig. Das sind dann aber immerhin noch ca. 285 Mio. Jahre bei 1000 Inserts/Sekunde ;)

Geschrieben am Dienstag, 14. September 2010 und abgelegt unter Webtechnik.