数据库创建表
在关系型数据库中,datetime和timestamp是两种用于表示日期时间的数据类型。它们的区别如下:
- 存储范围不同:datetime类型可以存储的日期时间范围是从'1000-01-01 00:00:00'到'9999-12-31 23:59:59';而timestamp类型可以存储的日期时间范围是从'1970-01-01 00:00:01'到'2038-01-19 03:14:07'。
- 存储空间不同:datetime类型在MySQL中占用8个字节的存储空间,而timestamp类型在MySQL中占用4个字节的存储空间。
- 存储方式不同:datetime类型存储的日期时间与时区无关,存储的是指定时区的本地日期时间;而timestamp类型存储的是从'1970-01-01 00:00:00'以来的秒数,也就是UTC时间。
- 默认值不同:datetime类型的默认值为'0000-00-00 00:00:00',而timestamp类型的默认值为当前时间。
- 自动更新行为不同:当一条记录被更新时,如果该记录的某个datetime类型的列被更新,则不会自动更新该列的值;而如果该记录的某个timestamp类型的列被更新,则该列的值会被自动更新为当前时间。
总的来说,datetime类型适用于存储与时区无关的日期时间,而timestamp类型适用于存储与时区有关的日期时间,例如存储记录创建或修改的时间戳。
空间占用
TIMESTAMP
:占 4 个字节(小数秒+3 个字节)DATETIME
:在 MySQL 5.6.4 之前,占 8 个字节 ,之后版本,占 5 个字节。(小数秒+3 个字节)TIMESTAMP
:可能不一致。存储值会被转换成 UTC 时间值再存入数据库。DATETIME
:与当前时间是一致的。
使用 now()
存储当前时间时,保存的实际值,是否与当前计算机时间一致?
TIMESTAMP 使用场景:计算飞机飞行时间
一架飞机,从中国北京起飞,降落在美国纽约,计算它从北京飞往纽约的飞行时间。飞机在北京时间 2021-10-10 11:05:00 从北京起飞,在纽约时间 2021-10-10 09:50:00 降落(JL8006)。
这个场景中,如果使用 TIMESTAMP 来存时间,起飞和降落时间的值,都会被转换成 UTC 时间,所以它们直接相减即可获得结果。但如果使用 DATATIME 格式存时间,还需要进行转换,才可以完成,容易出错。
DATATIME 使用场景:记录信息修改时间
如果只是记录文件修改时间,最后更新时间这种不涉及加减转换的情况,用 DATATIME 来存更直接,更方便,可读性高,不绕弯子,不容易出错。
CREATE TABLE `tb_follow`( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT `主键`, `user_id` bigint(20) unsigned NOT NULL, `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(`id`) )ENGINE = InnoDB DEFAULT CHARSET=utf8mb4;
"mb"在utf8mb4字符集中表示"multi-byte",意为"多字节",表示这种字符集支持使用1-4个字节表示Unicode字符集中的所有字符,因此可以称为"多字节"字符集。这个名称的含义是和utf8字符集相对应的,因为utf8字符集只支持使用1-3个字节表示Unicode字符集中的字符,因此被称为"变长多字节"字符集。
- 数据类型不同:CURRENT_TIMESTAMP没有括号返回的是MySQL的日期时间类型,而NOW()返回的是MySQL的字符串类型。