關於夏令時,utc,gmt這幾個概念建議先簡單了解下,下面不做解釋
先丟結論以表誠意:
如果程式不需要考慮時區,夏令時或者將來資料庫的機子遷移到別的地方時區變化,用datetime型別比較方便;
用timestamp可以避免上述的問題(mysql官方文件的簡單解釋是資料存入timestamp時會根據時區轉換為utc時間,取出的時候做個反轉換),但眾所周知timestamp的儲存位數只有4個位元組,只能用到2023年;
如果程式要避免第乙個問題,同時要跑到2037之後,可以用int或bigint儲存。此時需要一些mysql的轉換函式處理展示問題。
自己另外測試了下用datetime和int儲存時間在查詢方面的效率是不是有差別
mysql官方的reference裡說datetime本質上存的也是int,所以我的理解應該差別不大
表結構如上所示,tablec用int儲存,tabled用datetime,欄位createtime都做了索引兩個表大概都是27萬的資料執行如下sql查詢時間非常接近,在我機子上大概都是5秒多create
table
`tablec`
(`id`
int(11)
notnull
auto_increment
,`createtime`
int(32)
notnull
default
'0',
primary
key(
`id`
),index
`createtime`
(`createtime`))
collate
='utf8_general_ci'
engine
=innodb
create
table
`tabled`
(`id`
int(11)
notnull
auto_increment
,`createtime`
datetime
notnull
default
'0000-00-00 00:00:00'
,primary
key(
`id`
),index
`createtime`
(`createtime`))
collate
='utf8_general_ci'
engine
=innodb
select
count
(*)from
tablec
twheret.
createtime
>=
unix_timestamp
('2011-01-09 00:22:33'
)andt.
createtime
<=
unix_timestamp
('2017-10-27 00:22:33'
);
select
count
(*)from
tabled
twheret.
createtime
between
'2011-01-09 00:22:33'
and'2017-10-27 00:22:33'
;
mysql 時間型別的物理儲存
1.timestamp型別 在行資料中記錄的是時間戳,四個位元組,將四個位元組的資料轉換為整數就是從1970開始的秒數值 2.date型別 儲存3個位元組,例如,若行中記錄的是 gdb p buf 30 4 33 gdb p buf 31 5 73 gdb p buf 32 6 15 017 表示為...
mysql 人名用什麼型別 MySQL 資料型別
mysql 資料型別 mysql中定義資料欄位的型別對你資料庫的優化是非常重要的。mysql支援多種型別,大致可以分為三類 數值 日期 時間和字串 字元 型別。數值型別 mysql支援所有標準sql數值資料型別。這些型別包括嚴格數值資料型別 integer smallint decimal和nume...
mysql年齡用什麼型別 MySQL常用資料型別
資料型別是定義列中可以儲存什麼資料以及該資料實際怎麼儲存的基本規則。mysql的常用資料型別主要有一下四種 串資料型別 數值資料型別 日期和時間資料型別 二進位制資料型別 一.串資料型別 這是最常用的資料型別,有兩種基本的串型別 分別為定長串和不定長串。定長串結束長度固定的字元,其長度是建立表是指定...