MySQL の時間タイプの選択

MySQL の時間タイプの選択

MySQL は、日付と時刻を処理するために、DATETIME と TIMESTAMP という 2 つの非常によく似た型を提供しています。ほとんどの場合、どちらも問題ありませんが、場合によっては、それぞれに長所と短所があります。

日時

DATETIME は、1001 から 9999 までのより広い時間範囲を持ち、精度は秒単位です。保存形式は、日付と時刻をパッケージ化し、YYYYMMDDhhmmss 形式の整数として保存します。この時間はタイムゾーンに依存せず、8 バイトのストレージ スペースを占有します。デフォルトでは、MySQL は DATETIME を 2021-06-02 18:35:23 などの順序付けられた明確な形式で表示します。これは ANSI 標準の日付と時刻の形式です。

タイムスタンプ

TIMESTAMP は、1970 年 1 月 1 日の午前 0 時からのグリニッジ標準時 (GMT) からの秒数を保存するタイムスタンプです。 Unix システムのタイムスタンプと同じです。 TIMESTAMP は保存に 4 バイトしか必要としないため、1970 年から 2038 年までのより短い時間範囲を表すことができます。 MySQL は、タイムスタンプと日付間の変換を完了するための FROM_UNIXTIME および UNIX_TIMESTAMP 関数を提供します。

MySQL バージョン 4.1 以降では、TIMESTAMP で表示される形式は DATETIME に似ていますが、TIMESTAMP の表示はタイム ゾーンによって異なります。 MySQL サーバー、オペレーティング システム、およびクライアント接続にはすべてタイム ゾーン設定があります。したがって、複数のタイムゾーンの時刻が保存されている場合、TIMESTAMP と DATETIME の差は大きくなる可能性があります。 TIMESTAMP は使用時にタイムゾーン情報を保持しますが、DATETIME は単にテキストを使用して時間を表します。

TIMESTAMP には追加機能があります。デフォルトでは、MySQL は、値が指定されていない場合は現在の時刻を使用して TIMESTAMP 列に挿入し、更新中に値が指定されていない場合は現在の時刻を使用してフィールドを更新します。次のテスト テーブルを例に挙げます。

テーブルt_time_testを作成します(
    id INT 主キー、
    t_stamp タイムスタンプ、
    t_datetime 日付時刻
);

MySQL によって指定されるデフォルト値は現在のタイムスタンプ CURRENT_TIMESTAMP であり、それに応じて更新されることを示す ON UPDATE CURRENT_TIMESTAMP があることがわかります。

t_time_test(id, t_datetime) に値を挿入する
	(1, NULL)、 
	(2, '2021-06-02 18:48:04'), 
	(3、NULL);

t_stamp 列に現在の時刻が自動的に入力されていることがわかります。

この機能により、IoT プログラムを通じてデータ更新時間フィールドを維持し、MySQL で完了させることができます。

選び方

特性の観点から見ると、時間を保存するには DATETIME よりも効率的な TIMESTAMP の方が適している可能性があります。 Unix タイムスタンプを保存するために整数を使用する人もいますが、このアプローチには利点がなく、整数には追加の処理が必要になるため、お勧めできません。ただし、TIMESTAMP を使用して時間を保存しないように注意する必要がある状況がいくつかあります。

  • 誕生日: 誕生日は1970年より前であることは間違いありません。これはTIMESTAMPの範囲外です。
  • 有効期限: TIMESTAMP の最大時間は 2038 です。身分証明書や営業許可証などの有効期限を保存するには適していません。
  • ビジネスの生存時間: インターネット時代ではスピードが重要であり、ビジネスは急速に発展 (そして消滅) します。長く続くビジネスを望むなら、あなたのビジネスは 2038 年にもまだ運営されている可能性が高いでしょう。結局のところ、今はもう 2021 年ですから。あなたのビジネスが 2038 年まで存続できないと思うなら、それは問題ありません。もちろん、幸運にも 2038 年まで生き延びることができたら、必ず ToDo 項目を書き留めておいてください。2038 年 1 月 1 日までにデータ テーブルのタイムスタンプ フィールド タイプを変更してください。

ミリ秒の時間を保存する方法

通常、BIGINT を使用して時間を整数に変換して保存するか、浮動小数点数を使用して小数部分で 1 秒未満の精度で時間を表す必要があります。どちらの方法も実行可能です。もちろん、この時点では、フォーマット変換を行うにはアプリケーションのサポートが必要です。

結論

安全性やセキュリティの観点から、DATETIME型を優先することをお勧めします。TIMESTAMPに比べてパフォーマンスが少し犠牲になりますが、TIMESTAMPの時間範囲は欠陥です。隠れた危険を放置しないでください。2038年になると、あなたの会社は上場企業になっている可能性があり、プログラマーは原因がわからないバグの洪水に遭遇し、会社の株価が急落する可能性があります。そして、このプログラマーを探し出し、彼が会社の元大物であり、現在の株主であり、そしてあなたが経済的自由を達成した人であることを知ってください。恥ずかしいと思いませんか?

上記はMySQLの時間タイプの選択の詳細です。MySQLの時間タイプの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • 時刻を保存するために適切な MySQL の datetime 型を選択する方法
  • MySQLストレージ時間タイプの選択に関する問題の説明
  • mysqlの時間タイプの選択について
  • MySql と Java の時間型の解析
  • MySQL の日付データ型と時刻型の使用法の概要
  • MySQL の時間タイプとモードの詳細

<<:  見落とされがちなMETAタグの特殊効果(ページ遷移効果)

>>:  Tomcat でよく使われるフィルターの詳細な説明

推薦する

Apache ソースコードのインストールと仮想ホストの設定に関する詳細なチュートリアル

ソースからApacheをインストールする1. Apacheソースコードをアップロードして必要なソフト...

Vue2.0の双方向データバインディング原則を手動で実装する

一言で言えば: データハイジャック (Object.defineProperty) + パブリッシュ...

Linux 上でプロジェクトをリリースするために Tomcat を展開するプロセスにおけるさまざまな問題と解決策

プロジェクトをプロジェクトサイトのテスト環境にデプロイするJDK1.8トムキャット8.5 Maven...

MySQL インデックスの長所と短所、およびインデックス作成のガイドライン

1. インデックスを作成する理由(メリット)インデックスを作成するとシステムのパフォーマンスが大幅に...

CentOS7にPHP7 Redis拡張機能をインストールする方法

導入前回の記事では、Redis をインストールして設定しましたが、まだ終わりではありません。PHP ...

js クロージャとガベージ コレクション メカニズムの例の詳細な説明

目次序文文章1. 終了1.1 クロージャとは何ですか? 1.2 クロージャの特性1.3 クロージャを...

複数のフィールドをグループ化するMySQLグループ

日常の開発タスクでは、データ テーブル内のグループ化フィールドに基づいて統計データを取得するために、...

Dockerはmysqldumpコマンドを使用してプロジェクト内のmysqlデータをバックアップおよびエクスポートします。

mysqldump コマンドはじめに: データベースバックアッププログラム形式: mysqldum...

CSS グリッドレイアウトで列にアイテムを埋め込む方法

n 個のアイテムがあり、これらのアイテムをグリッド レイアウトの列に並べ替える必要があるとします。列...

Linux での grep コマンドの使い方の詳細な説明

1. 公式紹介grep は Linux でよく使用されるコマンドです。これは、ファイルやテキストに対...

jQueryは検証コード送信のコントロールボタンを無効にする機能を実装します

必要な効果: 確認コードを送信するためにクリックした後、ボタンは無効になり、5 秒後に無効解除されま...

ウェブフロントエンドに対する一般的な攻撃とその防止方法

ウェブサイトのフロントエンド開発で発生するセキュリティ問題は、クライアントブラウザで実行されるコード...

MySQL で特殊文字を含むデータベース名を作成する方法の例

序文この記事では、MySQL で特殊文字を使用してデータベース名を作成する方法について説明します。こ...