MySQL 時間型別的選擇

2022-09-24 10:18:07 字數 1619 閱讀 2524

mysql 提供了 datetime 和 timestamp 兩種非常相似的型別處理日期和時間,大部分情況下兩種都是 ok 的,但是有些情況二者會互有優劣。gpdepcdg

datetime 的時間跨度更大,可以從2023年到2023年,精度是秒。並且儲存的格式是將日期和時間打包使用 yyyymmddhhmmss格式的整數儲存,這個時間與時區無關,需要占用8個位元組的儲存空間。預設,mysql 顯示 的datetime是有序的,明確的格式,例如2021-06-02 18:35:23。這是 ansi 的標準日期時間格式。

timestamp即時間戳,儲存的是自格林威治時間(gmt)2023年1月1日零點以來的秒數。和 unix 系統的時間戳一樣。timestamp 僅需要4個位元組儲存,因此能夠表示的時間跨度更小,從2023年到2023年。mysql 提供了 from_unixtime 和 unix_timestamp 函式來完成時間戳和日期之間的轉換。

在 mysql 4.1版本後,timestamp 顯示的格式和 datetime 類似,但是,timestamp 的顯示依賴於時區。mysql 的服務端、作業系統以及客戶端連線都有時區的設定。因此,如果時間是從多個時區儲存的話,那 timestamp 和 datetime 的差別就會很大。timestamp 會保留使用時的時區資訊,而 datetime 僅僅是使用文字表示時間。

timestamp 還有額外的特性。預設地,mysql會在沒有指定值的情況下使用當前時間插入到 timestamp列,而更新的時候如果沒有指定值會使用當前時間更新該欄位,以下面的測試表為例:

create table t_time_test (

id i程式設計客棧nt primary key,

t_stamp timestamp,

t_datetime datetime

);可以看到mysql 給的預設值就是當前時間戳 current_timestamp,並且有個 on update current_timestamp表示會隨之更新:

insert into t_time_test(id, t_datetime) values

(1, null),

(2, '2021-06-02 18:48:04'),

(3, null);www.cppcns.com

可以看到 t_stamp 列自動填充了當前時間。

這個特性使得我們可以物協程式維護資料更新時間字段,而交由 mysql 完成。

從特性上看,可能會優先選擇使用 timestamp 來儲存時間,相比 datetime 來說更高效。也有些人使用整數儲存 unix 時間戳,實際上這種方式並不能獲益,而且整數還需要額外進行處理,因此並不推薦這麼做。但是一些情況需要注意不要使用 timestamp 儲存時間:

通常這個時候需要使用 bigint 來將時間轉換為整型儲存,或者是使用浮點數,用分數部分表示秒精度一下的時間,這兩種方式都可行。當然,這個時候需要應用支援做格式轉換。

從安全穩妥的角度考慮,建議還是優先選擇 datetime 型別,雖然相比 timestamp 會犧牲一點效能,但是 timestamp 的時間範圍是硬傷,不要埋下乙個隱患,等到真的2023年,你的公司可能是上市公司的時候,程式設計師可能會遭遇洪水般的 bug 衝擊而不明所以,結果公司的股價迎來閃崩!然後找出來這個程式設計師,發現是曾經公司的大神,目前的股東,已經實現財務自由的你!你說尷尬不尷尬?

關於mysql 的時間型別選擇

間型別 盡量使用timestamp型別,因為www.cppcns.com其儲存空間只需要 datetime 型別的一半。nceraeof對於只需要程式設計客棧精確到某一天的資料型別,建議使用date型別,因為他nceraeof的儲存空間只需要3個位元組,比timesta程式設計客棧mp還少。不建議通...

Mysql儲存時間選擇怎樣的字段型別

儲存時間,常用的有三個選擇datetime timestamp int。昨夜同事問到了,於是今天就總結一下自己的理解。插入效率 datetime timestamp int 讀取效率 int timestamp datetime 儲存空間 datetime timestamp int 具體上面的實驗...

mysql 的時間型別

在mysql中表示時間的資料型別有date datetime year timestamp time五種型別,它們的作用如下 型別 顯示格式 取值 儲存空間 零值 datetime yyyy mm dd hh mm ss 1000 01 01 00 00 00 到 9999 12 31 23 59 ...