我们在建立数据库表结构时候,不可避免的需要增加时间字段,一直以来 我所在的公司都习惯于使用INT型时间戳去记录时间,但是Laravel 框架默认使用timestamp来记录时间。今天咱们就来 探究一下几个时间类型之间的区别。
date | 1000-01-01 至 9999-12-31 | 只有日期,没有时间 |
datatime | 1000-01-01 00:00:00至 9999-12-31 23:59:59 | 时间格式 YY-mm-dd hh:mm:ss,默认精确到秒 |
timestamp | 1970-01-01 00:00:00 UTC至 2038-01-19 03:14:07 UTC | 同上 |
总表格中,可以看出,他们在时间范围以及格式上的不同,现在新建2张表
CREATE TABLE `test`(
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`create_at`TIMESTAMP,
PRIMRY KEY(`id`)
) ENGINE=INNODB DEFAULT CHARSET=UTF8 COMMENT ='表1';
CREATE TABLE `test1`(
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`create_at`DATETIME,
PRIMRY KEY(`id`)
) ENGINE=INNODB DEFAULT CHARSET=UTF8 COMMENT ='表2';
1.当新增时间 2050年时间时候
insert test (id,create_at) VALUES(2,'2050-09-18 00:00:00');
insert test1 (id,create_at) VALUES(2,'2050-09-18 00:00:00');
我们会看到 test表是无法存储的,会提示
Incorrect datetime value: '2050-09-18 00:00:00' for column 'create_at' at row 1
但是test1可以成功存储,这也是因为时间范围原因导致的。
2.时区处理不同
对于timestamp ,他将客户端插入的时间从当前时区转换为UTC进行存储,查询时候,又将其转换为客户端时间进行返回。而对于datetime,不做任何改变,基本上是原样输入和输出。
我们先看一下当前服务器时区
show VARIABLES like "%time_zone%"
结果
我们看一下没修改时区之前的查询结果:
都是表里面存储的9月18日
下面我们修改一下时区
我看看到test表的 creat_at字段 查询结果已经是 9月17了,而test1表数据并没有改变。
我想应该是Laravel是一个外国人开发的框架,并且在世界范围内使用这都很多,所以使用了timestamp 以方便时区问题解决。