Ferdinand: PHP und Datenbank Timestamps weichen ab... ....warum?

Hallo,

Ich baue gerade eine Datenbank, in die ich Timestamps einlesen will.

Komischerweise weicht der Timestamp meines PHP Scripts von dem in der Datenbank ab...?

Mein PHP:

$currTimestamp = round(microtime(true) * 1000);
echo $currTimestamp;

ergab beim letzten Aufruf 16464195412893

INSERT INTO myTable (user, pass, timestamp)
VALUES ('username', 'hashedPass', $currTimestamp)

ergibt in der Datenbank aber den Timestamp 2147483647


timestamp ist in der Datenbank vom Typ INT mit einer Länge von 15, also nichts weltbewegend verwerfliches.

Warum stimmen die Timestamps nicht überein?

Danke, Ferdinand.

  1. Tach!

    Mein PHP:

    $currTimestamp = round(microtime(true) * 1000);
    echo $currTimestamp;
    

    ergab beim letzten Aufruf 16464195412893

    Das ist ein Unix-Timestamp in Microsekunden, und für die meisten Fälle unnötig genau. Sekunden könnten vielleicht auch reichen, und wäre mit der Funktion time() zu ermitteln.

    INSERT INTO myTable (user, pass, timestamp)
    VALUES ('username', 'hashedPass', $currTimestamp)
    

    ergibt in der Datenbank aber den Timestamp 2147483647

    Das ist der Wert von Maximum Integer bei 32 Bit (4 Byte). Deine Angabe in Microsekunden ist zu groß dafür.

    timestamp ist in der Datenbank vom Typ INT mit einer Länge von 15, also nichts weltbewegend verwerfliches.

    BIGINT wüsstest du schon nehmen, oder den Timestamp in Sekunden.

    dedlfix.

  2. Hi,

    $currTimestamp = round(microtime(true) * 1000);
    echo $currTimestamp;
    

    ergab beim letzten Aufruf 16464195412893

    INSERT INTO myTable (user, pass, timestamp)
    VALUES ('username', 'hashedPass', $currTimestamp)
    

    ergibt in der Datenbank aber den Timestamp 2147483647


    2147483647 = 2 ^31 - 1

    Also der maximale Wert eines 32-bit-Integers ...

    timestamp ist in der Datenbank vom Typ INT mit einer Länge von 15, also nichts weltbewegend verwerfliches. Warum stimmen die Timestamps nicht überein?

    das weiß ich auch nicht, aber es sieht so aus, als würde der Wert auf das Maximum eines 32-bit-Integers eingeschränkt.

    An welcher Stelle das genau passiert, ist mir nicht klar.

    cu,
    Andreas a/k/a MudGuard

  3. Hallo Ferdinand,

    die Längenangabe bei INT ist irrelevant für den verfügbaren Wertebereich. Sie legt bei MYSQL die "display width" fest - was etwas ist, das den SQL Server gar nicht interessiert und von Anwendungen genutzt werden kann.

    Guckst Du hier.

    INT ist 32-bittig, und was Du siehst, ist der Maximalwert für einen SIGNED INT.

    Was Du brauchst, ist BIGINT.

    Guckst Du hier.

    Rolf

    --
    sumpsi - posui - obstruxi