之前脑海里就一念头总觉得啥时间都用int存储,最近在项目开发时,频繁见到datetime类型,对于MySQL数据库中的有关时间的字段该选用何种类型,引起了一些争论。因此作了一些简单的研究,看了一些blog和官方文档。最后作出一个本身的总结。html
INT类型通常用于存储Unix时间戳。使用一个简单的 INT 列保存 Unix 时间是最普通的方法。使用 INT,你能够确保你要保存的数字能够快速、可靠地插入到表中。mysql
若是只是存储 Unix 时间戳(而且在它的合法日期范围内),并且不打算在它上面使用任何基于日期的查询,我以为使用 INT 是能够的。它执行简单数值比较查询时很是快,由于只是在处理简单的数字。sql
结论:适合须要进行大量时间范围查询的数据表,不支持在此字段上进行MySQL时间函数的运算,好比from_unixtime数据库
Datetime 和 Timestamp 都保存日期和时间信息,同时,使用人类可读的日期形式,如 “2018-01-01”。服务器
TIMESTAMP: A four-byte integer representing seconds UTC since the epoch (‘1970-01-01 00:00:00’ UTC)ide
TIMESTAMP:一个四字节的整数,从1970-01-01 00:00:00开始算起。函数
Timestamp 和 Datetime 的核心不一样点主要在于 MySQL在内部如何表示这些信息:两种都以二进制而非字符串形式存储,但在表示日期/时间部分时 Timestamp (4 字节) 比 Datetime (5字节,从MySQL 5.6.4版本起,以前为8个字节) 少使用 1 字节。当保存毫秒部分时两种都使用额外的空间 (1到3 字节)。编码
非分数部分的DATETIME编码(5.6.4版本以后):.net
1 bit sign (1= non-negative, 0= negative)
17 bits year*13+month (year 0-9999, month 0-12)
5 bits day (0-31)
5 bits hour (0-23)
6 bits minute (0-59)
6 bits second (0-59)unix40 bits = 5 bytes
Timestamp 节省的 1 字节是有代价的:你只能存储从 ‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’ 之间的时间。而 Datetime 容许你存储从 ‘1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’ 之间的任什么时候间。
另外一个重要的差异是MySQL使用服务器的时区转换Timestamp值到它的 UTC 等价值再保存。当获取值是它会再次进行时区转换,因此你得回了你“原始的”日期/时间值。Datetime 列不会被数据库改变。不管时区怎样配置,每次都会保存和获取到一样的值。
在5.6版本以后,datetime开始能够使用current time做为默认值,因此再也不有timestamp比datetime更适合做为须要随插入和更新来变动时间的类型的说法。
结论:Datetime 是大多数场景下的最佳选择,理由是
- 无需任何转换便是人类可读的。
- 不会由于时区变换产生问题。
- 只比它的对手们多用 1 字节
- 支持更大的日期范围(从 1000 年到 9999 年)
没有完美的数据类型,只要最合适的数据类型。这么多类型同时存在必定是有其道理的,了解清楚了不一样类型的差别,就能选择最合适的类型。
参考: