1. 程式人生 > >TIMESTAMP型別欄位在SQL Server和MySQL中的含義和使用

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位元組,用來標識包含日期和時間部分的值,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則不會發生這種情況。

舉個簡單的例子。 如下,與sqlserver中完全不一致,MySQL中TIMESTAMP 欄位是一個日期欄位,允許顯式插入值。
同一個欄位值,沒有發生更改的情況下,也就是同一個值,當修改系統的時區之後,顯示出來的結果是不一樣的。
這一點正如上面說的:MySQL將TIMESTAMP型別的值轉換為UTC時間儲存,當然檢索的時候以當前時區的時間返回。

貌似轉來轉去的有點蛋疼,這個特性有什麼用處?
這一點對於某些誇時區的應用顯示十分有效,最最簡單的就是outlook上的收發郵件的時間顯示,
比如誇時區的兩個人發郵件,發郵件的時間是一個確定的時間,對於A來說,顯示自己的時區時間,對於B來說,也是顯示為自己時區的時間。
這一點就有點類似於TIMESTAMP,儲存為標準時間,根據系統轉換為具體的時區時間。

以上,不管在SQL Server中還是MySQL中,DATETIME和TIMESTAMP的作用以及特性都是不同的,SQL Server中尤甚,MySQL也有各自的特性。
選取某種欄位型別,是根據需要來的,而不是說可以儘量用哪個,儘量不用哪個。
資料庫中很多東西都是根據具體情況來的,網上總結的很多優化的條條框框,怎麼說呢,還是不說了!

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