TIMESTAMP類型字段在SQL Server和MySQL中的含義和使用

 

公衆號上轉的滿天飛的一篇文章,MySQL優化相關的,無心中瞄到一句「儘可能使用TIMESTAMP而非DATETIME」,以前對TIMESTAMP也不太熟悉,不多使用,因而查了一下二者的區別。html

其實,無論在SQL Server中仍是MySQL中,「儘可能使用TIMESTAMP而非DATETIME」都是有問題的。mysql


 

在SQL Server中的TIMESTAMPsql

SQL Server中,TIMESTAMP是ROWVERSION的同義詞,或者說是別名,TIMESTAMP或者ROWVERSION是什麼鬼?
MSDN上的解釋是:數據庫中公開的、自動生成的惟一二進制數字的數據類型。 參考這裏
兩個定語:惟一的,二進制的,說白了就是數據庫級別惟一性的一個二進制數據類型
 
SQL Server中TIMESTAMP/ROWVERSION的表現:
1,不可顯式插入(或者是更新)。
2,對(包含了)rowversion的表更新非rowversion字段更新的時候,rowversion會自動更新。
3,rowversion在數據庫級別具備全局性、遞增性、不可回滾性等。
 
不可顯式往timestamp類型字段插入值,只能以default或者默認值的方式插入

只能以默認值或者默認生成的方式插入數據數據庫

對(包含了)rowversion的表中的數據行更新的時候,rowversion會自動更新。sqlserver

全局性,這裏暫不表述全局性的一些細節問題。優化

ROWVERSION的做用:
標記數據行的更改,也就是說,一個表包含了ROWVERSION的字段的時候,ROWVERSION字段在數據發生變化(新增,更新)的時候自動更新。
能夠根據ROWVERSION來比較不一樣數據源相同數據行中是否發生了變化,用來作數據同步。比較少使用

 

MySQL中的TIMESTAMPspa

在MySQL中:3d

DATETIME :長度8字節,用來標識包含日期和時間部分的值,MySQL以‘YYYY-MM-DD HH:MM:SS’格式檢索並顯示DATETIME類型字段。
支持的範圍是‘1000-01-01 00:00:00’ to ‘9999-12-31 23:59:59’.server

TIMESTAMP :長度4字節,用來標識包含日期和時間部分的值,
支持的範圍是 ‘1970-01-01 00:00:01’ (標準時間) to ‘2038-01-19 03:14:07’ (標準時間)。htm

DATETIME 與TIMESTAMP 的不一樣:
MySQL將TIMESTAMP類型的值轉換爲UTC時間存儲,固然檢索的時候以當前時區的時間返回下面具體舉例,而DATETIME則不會發生這種狀況。

舉個簡單的例子。
以下,與sqlserver中徹底不一致,MySQL中TIMESTAMP 字段是一個日期字段,容許顯式插入值。
同一個字段值,沒有發生更改的狀況下,也就是同一個值,當修改系統的時區以後,顯示出來的結果是不同的。
這一點正如上面說的: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

關於二者的區別,筆者一開始也不徹底清楚,我也是各類搜索以後簡單總結了一下,無心冒犯原做者。

相關文章
相關標籤/搜索