1.字符串存储日期
相信对数据库不太了解的新手容易将时间以字符串的形式进行存储。可见,这种存储日期的方式的优点还是有的,就是简单直白,容易上手。
但是,这种做法会存在下面两个问题:
1.字符串占用的空间更大!
2.字符串存储的日期比较效率比较低(逐个字符进行比对),无法用日期相关的 API 进行计算和比较。
2.DATETIME、TIMESTAMP与时间戳对比
| 时间类型 | DATETIME | TIMESTAMP | 时间戳 |
|---|---|---|---|
| 存放格式 | yyyy-MM-dd HH:mm:ss | yyyy-MM-dd HH:mm:ss | 整数(int/Bigint) |
| 时间范围 | “1000-00-00 00:00:00”到“9999-12-31 23:59:59” | “1970-01-01 00:00:01 UTC”到“2038-01-19 03:14:07 UTC” | 从一个基准时间(1970-1-1 00:00:00 +0:00)到现在的秒数 |
| 存储大小 | 8个字节 | 4个字节 | 4/8个字节 |
| 优点 | 1.有一系列时间函数可以用 | 1.有一系列时间函数可以用 2.不仅存储来日期和时间还存储来时区 | 1.比较时很简单,只需要比较两个树枝的大小会范围即可 2.显示问题也很容易处理,只需要根据所在时区对数值进行转换即可 |
| 缺点 | 不能区分时区 | 表示的时间范围有限 | 数据库展示不直观,是一串数字 |
3.数据库中存储格式
a.存储格式
b.获取到的格式
注:以上存储格式表示的Bigint、DataTime、TimeStamp以及Data四种类型存放在数据库中的格式,获取到的格式表示直接从数据库获取到的四种类型的时间格式。相较而言Bigint在获取之后可以更方便做转换。
4.疑问
上面展示了三种常见的数据库时间存储类型的对比,但是还有些问题;
DATETIME和TIMESTAMP的默认值?
DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间;
DATETIME和TIMESTAMP在数据库是如何存储的以及查询效率?
以上三种内部存储都是整数,对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。而对于DATETIME,不做任何改变,基本上是原样输入和输出。而时间戳不需要转换,所以查找效率int/Bigint>DATETIME>TIMESTAMP(这个排序是在对时间字段有进行操作(如通过时间范围查找或者排序等));
注:其实问题还有很多。这是笔者写项目时,对时间进行存储选择了时间戳;但是为什么要选择时间戳?便查询了些数据存储类型,以及编写Demo观察几种类型在前后端的格式。总结这篇文章应该知道选择时间戳的优点(便于比较、转换以及查询效率等),最大的问题就是不便于数据库的观察。