golang mysql中timestamp,datetime,int類型的區別與優劣

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。


golang time:  https://golang.org/pkg/time/


golang中time包用法 http://blog.csdn.net/chenbaoke/article/details/41519193



首先 DATETIM和TIMESTAMP類型所佔的儲存空間不同,前者8個位元組,後者4個位元組,這樣造成的後果是兩者能表示的時間範圍不同。前者範圍為1000-01-01 00:00:00 ~ 9999-12-31 23:59:59,後者範圍為1970-01-01 08:00:01到2038-01-19 11:14:07。所以可以看到TIMESTAMP支援的範圍比DATATIME要小,容易出現超出的情況.

其次,TIMESTAMP類型在預設情況下,insert、update 資料時,TIMESTAMP列會自動以目前時間(CURRENT_TIMESTAMP)填充/更新。

第三,TIMESTAMP比較受時區timezone的影響以及MYSQL版本和伺服器的SQL MODE的影響

所以一般來說,我比較傾向選擇DATETIME,至於你說到索引的問題,選擇DATETIME作為索引,如果碰到大量資料查詢慢的情況,也可以分區表解決。


其實速度上差別不是很大,你可以自己做做測試就知道了。內部儲存都是整數,只不過datetime和timestamp會僅僅在顯示的時候,顯示為人能讀的日期(當然儲存空間有點區別,整形和timestamp都是4位元組,datetime是8位元組),做索引也應該沒什麼區別,這個不敢確定,如果有請指正我……

另外datetime和timestamp相對於int來說也有一個小小的好處,就是對於時間類型來說,可以有一系列的時間函數可以用

Q:Mysql的時間欄位貌似有各種選擇,像一般的情況(我也是)下就是用INT型來表示,直接儲存時間戳記。但是我知道在Mysql裡至少還有TIMESTAMPDATETIME型可以用來儲存時間,我不知道這三者在使用上各有什麼區別,在使用情境上需要怎麼考慮,特別是它們在索引或者查詢速度上有區別嗎?


這幾個類型的選擇還是看你的需求。

我用timestamp比較多,對於記錄日誌什麼的需求,timestamp絕對夠用了,除非你保證說你的程式能一直用到2038年,就算如此也可以用遷移程式處理……

如果需求是允許使用者儲存一些超過timestamp能儲存的時間(@QingchaoWu 已經給出了timestamp的範圍)比如說todo list什麼的,允許使用者計劃38年以後的事情,那就用datetime好了。



##################################


轉載請註明來自souldak,微博:@evagle
以下內容 整合篩選自互連網:

int
1. 佔用4個位元組
2. 建立索引之後,查詢速度快
3. 條件範圍搜尋可以使用使用between
4. 不能使用mysql提供的時間函數
結論:適合需要進行大量時間範圍查詢的資料表

datetime
1. 佔用8個位元組
2. 允許為空白值,可以自訂值,系統不會自動修改其值。

3. 實際格式儲存(Just stores what you have stored and retrieves the same thing which you have stored.)

4. 與時區不轉換(It has nothing to deal with the TIMEZONE and Conversion.)

5. 不可以設定預設值,所以在不允許為空白值的情況下,必須手動指定datetime欄位的值才可以成功插入資料。6. 可以在指定datetime欄位的值的時候使用now()變數來自動插入系統的目前時間。結論:datetime類型適合用來記錄資料的原始的建立時間,因為無論你怎麼更改記錄中其他欄位的值,datetime欄位的值都不會改變,除非你手動更改它。
timestamp
1. 佔用4個位元組
2. 允許為空白值,但是不可以自訂值,所以為空白值時沒有任何意義。
3. TIMESTAMP值不能早於1970或晚於2037。這說明一個日期,例如'1968-01-01',雖然對於DATETIME或DATE值是有效,但對於TIMESTAMP值卻無效,如果分配給這樣一個對象將被轉換為0。

4.值以UTC格式儲存( it stores the number of milliseconds)

5.時區轉化 ,儲存時對當前的時區進行轉換,檢索時再轉換回當前的時區。

6. 預設值為CURRENT_TIMESTAMP(),其實也就是當前的系統時間。7. 資料庫會自動修改其值,所以在插入記錄時不需要指定timestamp欄位的名稱和timestamp欄位的值,你只需要在設計表的時候添加一個timestamp欄位即可,插入後該欄位的值會自動變為當前系統時間。8. 以後任何時間修改表中的記錄時,對應記錄的timestamp值會自動被更新為當前的系統時間。結論:timestamp類型適合用來記錄資料的最後修改時間,因為只要你更改了記錄中其他欄位的值,timestamp欄位的值都會被自動更新。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.