MySQL: datetime vs timestamp
4475 ワード
区別する のみサポートする. である. を参照してください.
誤解する
ネット上でいくつかの説明にエラーがありますエラー:
ベストプラクティスグローバルサービスまたはタイムスパン呼び出しを提供する必要がある場合、 を用いる.は時間のスパンが大きく、
表
表中の
タイムゾーンが
注意事項 CST:複数のタイムゾーンを表す可能性のある略記です.ここでは を表しています.
参考資料 MySQL: DATETIME vs TIMESTAMP TIMESTAMP vs. DATETIME, which should I be using? MySQL Datetime vs Timestamp column types – which one I should use? MybatisとMysqlのDatetimeのいくつかの問題 少しでも助けがあれば、いいねをしてください.もしなければ、あなたのフィードバックも期待しています.
datetime
サポート時間区間1000-01-01 00:00:00
から9999-12-31 23:59:59
timestamp
は'1970-01-01 00:00:01' UTC
から'2038-01-19 03:14:07' UTC
datetime
は直接保存する変換を必要とせず、timestamp
はUTC時間に移行してデータベースに保存し、select時に現在のタイムゾーンに移行する時間datetime
ストレージには、mysqlがミリ秒をサポートする前に、datetime
は8
バイトを必要とし、timestamp
は4
バイトしか必要としません.詳細はTIMESTAMP vs.DATETIME,which should I be using?;ミリ秒をサポートした後、ストレージスペースは2回変更されました.詳細はMySQL:DATETIME vs TIMESTAMP 誤解する
ネット上でいくつかの説明にエラーがあります
datetime
はインデックスの作成をサポートしていませんが、実際にはサポートされています.person | CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `ctime` (`create_time`),
KEY `mtime` (`modify_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
ベストプラクティス
datetime
とtimestamp
は明らかな優劣の区別がなく、実際のシーンを見ることを選んだら、ここで自分と他の人の経験をまとめます.timestamp
が優先的に選択される.ただし、異なるタイムゾーンで同じ時間を表示する場合は、datetime
(具体的なアプリケーションを参照)timestamp
は満足できないので、datetime
しか選択できません.例えば歴史時間や未来時間.datetime
およびtimestamp
へのタイムゾーンの影響mysql> show create table person;
+--------+---------------------------------------------------------------------------+
| Table | Create Table |
+--------+---------------------------------------------------------------------------+
| person | CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+---------------------------------------------------------------------------+
1 row in set (0.00 sec)
表
person
のcreate_time
フィールドはdatetime
タイプ、modify_time
はtimestamp
タイプであるmysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | CST |
| time_zone | SYSTEM |
+------------------+--------+
2 rows in set (0.06 sec)
mysql> select * from person;
+----+------+---------------------+---------------------+
| id | name | create_time | modify_time |
+----+------+---------------------+---------------------+
| 1 | tim | 2018-07-14 17:42:40 | 2018-07-14 17:42:40 |
+----+------+---------------------+---------------------+
1 row in set (0.00 sec)
表中の
create_time
とmodify_time
の時間はいずれも2018-07-14 17:42:40
であることがわかるmysql> set time_zone='+00:00';
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | CST |
| time_zone | +00:00 |
+------------------+--------+
2 rows in set (0.00 sec)
mysql> select * from person;
+----+------+---------------------+---------------------+
| id | name | create_time | modify_time |
+----+------+---------------------+---------------------+
| 1 | tim | 2018-07-14 17:42:40 | 2018-07-14 09:42:40 |
+----+------+---------------------+---------------------+
1 row in set (0.00 sec)
タイムゾーンが
0
のタイムゾーンに設定されている場合、create_time
は変わらないが、modify_time
の保存はタイムゾーンに関係なく、表示されると自動的に現在のタイムゾーンに移行するため、timestamp
が変化していることがわかる注意事項
China Standard Time
ですが、ほとんどの場合、アメリカ中部標準時間Central Standard Time
参考資料