web-dev-qa-db-ja.com

UNIXタイムスタンプはどのようにint列に保存されるべきですか?

統計上の理由で数百万の書き込みを含むロギングテーブルがあります。すべての列はint外部キーです。また、各行にタイムスタンプ列を追加します。 DATETIMEに8ビットかかるとすると、int(10) unsignedを使用してストレージスペース(およびその列のインデックス)を半分に削減します。

ただし、この列がいつ機能しなくなるのか疑問に思っています。 2038年1月19日の3:14:07 AMで、UNIXタイムスタンプの値9,999,999,999は問題になりますが、MySQLのunsigned intは最大4,294,967,295のみを保持し、タイムスタンプ4294967295はmy PHPアプリケーション。

つまり、これはどういう意味ですか?MySQLでのintタイムスタンプの保存の終わりは、9999999999に達することができないため、2021年のどこかになりますか?

回答:

  1. 2147483647は2038(9999999999ではない)なので、問題はありません。
  2. unsignedは、2147483647が署名付きMySQL intにうまく適合するため必要ありません。
59
Xeoncross

標準のUNIXタイムスタンプは、32ビットの符号付き整数で、MySQLでは通常の「int」列です。 9,999,999,999を保存する方法はありません。これは、表現範囲の外側にあるためです。あらゆる種類の32ビット整数の最大値は4,294,967,295です。符号付き32ビット入力の最高値は2,147,483,647です。

UNIXタイムスタンプが64ビットデータ型に移動する場合、MySQLの「bigint」を使用してそれらを保存する必要があります。

int(10)に関しては、(10)部分は、表示目的のためだけです。 MySQLは引き続き内部で完全な32ビットを使用して数値を格納しますが、テーブルで選択を行うたびに10のみを表示します。

90
Marc B