文字列はより多くのスペースを必要とします。
文字列に格納された日付の比較効率は比較的低く (文字ごとの比較)、日付関連の API を使用して計算および比較することはできません。
Datetime と Timestamp は、MySQL が提供する時間を保存するための 2 つの類似したデータ型です。
どちらかを選択するにはどうすればよいですか?
通常は Timestamp を好みます
DateTime 型にはタイム ゾーン情報がありません (タイム ゾーンは無関係です)
Whenたとえば、サーバーのアドレスが変更されたり、クライアント接続のタイム ゾーン設定が変更されたりすると、タイム ゾーンが変更された後、データベースから読み取る時間が不正確になります。
タイムスタンプはタイムゾーンに関連しています。
タイムスタンプ タイプ フィールドの値は、サーバーのタイム ゾーンの変更とともに変更され、対応する時刻に自動的に変換されます。簡単に言うと、タイム ゾーンが異なると、このフィールドの値は次のようになります。クエリされた同じレコードでも異なります。
以下に実際的なデモンストレーションを行ってみましょう。
テーブル SQL ステートメントの作成:
CREATE TABLE `time_zone_test` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `date_time` datetime DEFAULT NULL, `time_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
データの挿入:
INSERT INTO time_zone_test(date_time,time_stamp) VALUES(NOW(),NOW());
データの表示:
select dsqlate_time,time_stamp from time_zone_test;
結果:
-------------------------- ---------------------
| date_time time_stamp |
---------- -------------------- -
| 2020-01-11 09:53:32 | 2020-01-11 09:53:32 |
-------------------- ------ --- ------------------
現在のセッションのタイムゾーンを変更します:
set time_zone='+8:00';
データをもう一度表示します:
--------------------- ------------- --------
| 日付時刻 | タイムスタンプ |
--------------------- ---------- -----------
| 2020-01-11 09:53:32 | 2020-01-11 17:53:32 |
---------- - - - - - - - - - - - - - - - - - - - ############拡大: MySQL のタイム ゾーン設定に関する一般的な SQL コマンド
1. 現在のセッションのタイム ゾーンを表示します SELECT @@session.time_zone;
SET time_zone = 'Europe/Helsinki'; SET time_zone = "+00:00";
3 .データベースのグローバル タイム ゾーン設定
SELECT @@global.time_zone;
4. グローバル タイム ゾーンの設定
SET GLOBAL time_zone = '+8:00'; SET GLOBAL time_zone = 'Europe/Helsinki';
2.2 DateTime 型はより多くのスペースを消費します
タイムスタンプは 4 バイトのストレージ スペースのみを使用する必要がありますただし、DateTime は 8 バイトの記憶域スペースを消費する必要があります。ただし、このアプローチでは、タイムスタンプの時間範囲がより制限されるという問題も生じます。
日時
MySQL のさまざまなバージョンのタイムスタンプ微妙な違いがあります。
次の図は、MySQL 5.6 バージョンで日付型が占める記憶領域を示しています。
5.6.4 以降の MySQL には、0 ~ 3 バイトを必要とする余分な小数点があることがわかります。 DataTime と Timestamp は、保存時に異なるストレージ領域を占有します。 便宜上、この記事では、Timestamp には 4 バイトの記憶域スペースのみが必要ですが、DateTime には 8 バイトの記憶域スペースが必要であることをデフォルトのままとします。4. 数値タイムスタンプの方が良い選択なのでしょうか?
多くの場合、時刻を表すために int または bigint 型の値、つまりタイムスタンプも使用します。
この保存方法にはタイムスタンプ タイプのいくつかの利点があり、これを使用して日付の並べ替えと比較操作を実行すると効率が向上し、またシステム間で非常に便利です。 。欠点も明らかで、データの可読性が非常に悪く、具体的な時間を直感的に見ることができないことです。
タイムスタンプの定義は次のとおりです。 タイムスタンプの定義は、基準時刻「1970-1-1 00:」からカウントします。 00:00 0:00"、この時刻から始まり、秒単位で測定される整数として表されます。この時刻の整数は時間の経過とともに増加し続けます。このように、時間を完全に表すために必要な値は 1 つだけであり、この値は絶対値です。つまり、地球のどこにいても、時間を表すタイムスタンプは同じであり、生成された値です。すべて同じであり、タイム ゾーンの概念がないため、システム内で時刻を送信する際に追加の変換は必要なく、ユーザーに表示するときに文字列形式で現地時刻に変換されるだけです。データベースでの実際の操作:
mysql> select UNIX_TIMESTAMP('2020-01-11 09:53:32'); +---------------------------------------+ | UNIX_TIMESTAMP('2020-01-11 09:53:32') | +---------------------------------------+ | 1578707612 | +---------------------------------------+ 1 row in set (0.00 sec) mysql> select FROM_UNIXTIME(1578707612); +---------------------------+ | FROM_UNIXTIME(1578707612) | +---------------------------+ | 2020-01-11 09:53:32 | +---------------------------+ 1 row in set (0.01 sec)
5. 概要時間の数値表現は直感的ではないため、タイムスタンプを推奨します
どの方法にもそれぞれ独自の利点があり、実際のシナリオに基づいて最適な方法が選択されます。実際の開発で保存時間に適したデータ型を選択できるように、これら 3 つの方法を簡単に比較してみましょう:
[mysqld] sql-mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
以上がMySQL データベースに時間を保存する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。