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


 

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

其實,不管在SQL Server中還是MySQL中,“盡量使用TIMESTAMP而非DATETIME”都是有問題的。


 

在SQL Server中的TIMESTAMP

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

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

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

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

ROWVERSION的作用:
標記數據行的更改,也就是說,一個表包含了ROWVERSION的字段的時候,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’.

小數秒精度--> 存儲(字節)
0    -->0
1,2 -->1
3,4--> 2
5,6--> 3
 

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

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

關於兩者的區別,筆者一開始也不完全清楚,我也是各種搜索之后簡單總結了一下,無意冒犯原作者。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM