公眾號上轉的滿天飛的一篇文章,MySQL優化相關的,無意中瞄到一句“盡量使用TIMESTAMP而非DATETIME”,之前對TIMESTAMP也不太熟悉,很少使用,於是查了一下兩者的區別。
其實,不管在SQL Server中還是MySQL中,“盡量使用TIMESTAMP而非DATETIME”都是有問題的。
在SQL Server中的TIMESTAMP

只能以默認值或者默認生成的方式插入數據
對(包含了)rowversion的表中的數據行更新的時候,rowversion會自動更新。
全局性,這里暫不表述全局性的一些細節問題。
MySQL中的TIMESTAMP
在MySQL中:
DATETIME :長度8字節(MySQL5.6之后實際上是5字節+對應的精度字節,最大8個字節),用來標識包含日期和時間部分的值,MySQL以‘YYYY-MM-DD HH:MM:SS’格式檢索並顯示DATETIME類型字段。
支持的范圍是‘1000-01-01 00:00:00’ to ‘9999-12-31 23:59:59’.
TIMESTAMP :長度4字節,用來標識包含日期和時間部分的值,
支持的范圍是 ‘1970-01-01 00:00:01’ (標准時間) to ‘2038-01-19 03:14:07’ (標准時間)。
DATETIME 與TIMESTAMP 的不同:
MySQL將TIMESTAMP類型的值轉換為UTC時間存儲,當然檢索的時候以當前時區的時間返回,下面具體舉例,而DATETIME則不會發生這種情況。
同一個字段值,沒有發生更改的情況下,也就是同一個值,當修改系統的時區之后,顯示出來的結果是不一樣的。
這一點正如上面說的:MySQL將TIMESTAMP類型的值轉換為UTC時間存儲,當然檢索的時候以當前時區的時間返回。
貌似轉來轉去的有點蛋疼,這個特性有什么用處?
這一點對於某些誇時區的應用顯示十分有效,最最簡單的就是outlook上的收發郵件的時間顯示,
比如誇時區的兩個人發郵件,發郵件的時間是一個確定的時間,對於A來說,顯示自己的時區時間,對於B來說,也是顯示為自己時區的時間。
這一點就有點類似於TIMESTAMP,存儲為標准時間,根據系統轉換為具體的時區時間。
以上,不管在SQL Server中還是MySQL中,DATETIME和TIMESTAMP的作用以及特性都是不同的,SQL Server中尤甚,MySQL也有各自的特性。
選取某種字段類型,是根據需要來的,而不是說可以盡量用哪個,盡量不用哪個。
數據庫中很多東西都是根據具體情況來的,網上總結的很多優化的條條框框,怎么說呢,還是不說了!
參考:
https://dev.mysql.com/doc/refman/5.7/en/datetime.html
https://www.eversql.com/mysql-datetime-vs-timestamp-column-types-which-one-i-should-use/
https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/rowversion-transact-sql?view=sql-server-2017
關於兩者的區別,筆者一開始也不完全清楚,我也是各種搜索之后簡單總結了一下,無意冒犯原作者。