70

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

しかし、このコラムはいつ機能しなくなるのでしょうか。2038 年 1 月 19 日の午前 3 時 14 分 7 秒の時点で、値 9,999,999,999 は UNIX タイムスタンプの問題になります。ただし、MySQL の unsigned int は最大 4,294,967,295 までしか保持できず、タイムスタンプ 4294967295 は PHP アプリケーションで無効な数値を示しています。

では、これはどういう意味ですか?9999999999 まで到達できないため、MySQL での int タイムスタンプの保存は 2021 年のいずれかで終了しますか?

答え:

  1. 2147483647 は 2038 (9999999999 ではない) なので問題ありません。
  2. unsigned2147483647 は署名された MySQL int にうまく適合するため、必要ありません。
4

1 に答える 1

100

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

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

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

于 2010-11-27T02:28:33.780 に答える