web-dev-qa-db-ja.com

MySQLでUNIXタイムスタンプを保存する方法

背景:

私のウェブサイトは、あらゆる種類の異なるタイムゾーンでユーザーを調整することに大きく依存しています。

私は、サーバー側でタイムゾーンの変換と計算を処理し、クライアントでmoment.jsを処理するためにCarbonを使用しています。

その結果、すべての日付時刻(イベントの開始時刻など)がUNIXタイムスタンプとして保存されるように設計が選択されました。

問題

「タイムスタンプ」の定義に少し混乱しています。 PHPMyAdminでは、タイムスタンプはUNIXタイムスタンプではなく、日付形式です。

_2016-10-06 20:50:46
_

したがって、現在のタイムスタンプのデフォルトのフィールドが必要な場合は、GMTで現在の日付を取得します。

これにより、Unixタイムスタンプ整数と比較して、ユーザーのタイムゾーンに戻すのがより複雑になります...

質問:

UNIXのタイムスタンプをどのフィールドタイプとして保存する必要がありますか。現在、int(11)をデフォルトのnoneで使用しています。拡張により...デフォルトでMySQLに現在のUNIXタイムスタンプ(1475971200など)を保存する方法はありますか?

12

Unixタイムスタンプは大きな整数(1970-01-01 00:00:00 UTC以降の秒数)であるため、INT(11)が正しいデータ型です。

残念ながら、現在のタイムスタンプを挿入するデフォルトを指定する方法はないと思います。挿入時にUNIX_TIMESTAMP()を明示的に呼び出して使用する必要があります。関数呼び出しはDEFAULT仕様では許可されていません。

15
Barmar

符号なしINTを引き続き使用できますが、挿入時にタイムスタンプを手動で設定する必要があります(UNIX_TIMESTAMP())。

または、TIMESTAMP型をデフォルトのCURRENT_TIMESTAMP(舞台裏でintとして保存されます)で使用し、選択時にそれをintに変換できます。
SELECT UNIX_TIMESTAMP(foo_field) FROM foo_table

リファレンス- MySQLでUNIX_TIMESTAMPのデフォルトを使用して列を作成することは可能ですか?

2
George Kagan

実際、int(11)の最大値は2'147'483'647であるため、bigintまたはvarcharを使用する必要があります(詳細 here )。

次に、前の答えが示すように、UNIX_TIMESTAMP()を手動で挿入する必要があります

0
Luka Govedič

int(10)は、最大4294967295および現在のタイムスタンプ1553244188の10桁の数値に対しては問題ありません。整数フィールドでは、クエリに整数のデフォルト0(設定されていない)を使用します。

0
Nik Drosakis