MySQL: datetime vs timestamp

4475 ワード

区別する
  • datetimeサポート時間区間1000-01-01 00:00:00から9999-12-31 23:59:59timestamp'1970-01-01 00:00:01' UTCから'2038-01-19 03:14:07' UTC
  • のみサポートする.
  • datetimeは直接保存する変換を必要とせず、timestampはUTC時間に移行してデータベースに保存し、select時に現在のタイムゾーンに移行する時間
  • である.
  • datetimeストレージには、mysqlがミリ秒をサポートする前に、datetime8バイトを必要とし、timestamp4バイトしか必要としません.詳細は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
    

    ベストプラクティスdatetimetimestampは明らかな優劣の区別がなく、実際のシーンを見ることを選んだら、ここで自分と他の人の経験をまとめます.
  • グローバルサービスまたはタイムスパン呼び出しを提供する必要がある場合、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)
    

    personcreate_timeフィールドはdatetimeタイプ、modify_timetimestampタイプである
    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_timemodify_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が変化していることがわかる
    注意事項
  • CST:複数のタイムゾーンを表す可能性のある略記です.ここではChina Standard Timeですが、ほとんどの場合、アメリカ中部標準時間Central Standard Time
  • を表しています.
    参考資料
  • 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のいくつかの問題
  • 少しでも助けがあれば、いいねをしてください.もしなければ、あなたのフィードバックも期待しています.