MySQL: datetime vs timestamp
區別
-
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?;支援毫秒之後,儲存空間有兩次變化,細節參見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
的儲存是與時區無關的,當顯示的時候,則會自動轉變為當前時區的時間
注意事項
- 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的一些問題
如果有一點幫助,麻煩點一個贊,如果沒有,也期待你的反饋
相關文章
- MySQL中datetime和timestamp的區別MySql
- Mysql中的Datetime和Timestamp比較MySql
- MySQL 的 timestamp 和 datetime 型別比較MySql型別
- mysql資料庫date 、datetime、time、timestamp區別MySql資料庫
- python date 和 datetime 的取值範圍(對比 Mysql 的 datetime 和 timestamp)PythonMySql
- Mysql日期(DATE, TIME, DATETIME, TIMESTAMP)型別的比較MySql型別
- Mysql時間欄位格式如何選擇,TIMESTAMP,DATETIME,INT?MySql
- mysql中的date、datetime、timestamp你還不知道怎麼使用嗎MySql
- MySQL 5.7 datetime和timestamp欄位設定default 0 插入資料包錯MySql
- mysql資料庫時間型別datetime、bigint、timestamp的查詢效率比較MySql資料庫型別
- Mysql - 如何決定用 datetime、timestamp、int 哪種型別儲存時間戳?MySql型別時間戳
- QXMySQL 中 datetime 和 timestamp 的區別與選擇lypMySql
- 面試題:能談談Date、Datetime、Time、Timestamp、year的區別嗎?面試題
- MySQL中的CURRENT_TIMESTAMPMySql
- mysql timestamp比較查詢MySql
- mysql 資料型別TIMESTAMPMySQL 資料型別
- mysql datetime增加預設值MySql
- mysql-資料庫欄位date datetimeMySql資料庫
- MYSQL timestamp NOT NULL插入NULL的報錯問題MySqlNull
- 故障分析 | MySQL 遷移後 timestamp 列 cannot be nullMySqlNull
- The SQL vs NoSQL Difference: MySQL vs MongoDBMySqlMongoDB
- 教你如何使用MySQL中CURRENT_TIMESTAMP時間戳MySql時間戳
- Oracle TimestampOracle
- mysql bigint型別和datetime型別的轉換MySql型別
- ElasticSearch 索引 VS MySQL 索引Elasticsearch索引MySql
- [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.explicit_defaults_for_timestamp
- TIMESTAMP和TIMESTAMP WITH TIME ZONE之間的總結
- 建立一個MySQL資料庫中的datetime型別MySql資料庫型別
- mysql-timestamp 0000-00-00 00:00:00 Invalid default valueMySql
- python datetimePython
- partitioned by timestamp datatype
- MySQL:從庫binlog 使用mysqlbinlog stop-datetime過濾問題MySql
- MySQL:一次timestamp時區轉換導致的問題MySql
- pd.to_datetime方法將字串轉為datetime型字串
- 7.85 EXTRACT (datetime)
- python datetime庫Python
- JavaScript event.timeStampJavaScript
- 7.71 CURRENT_TIMESTAMP