写在前面
在设计数据库表时不可避免的需要用到时间类型,到底选择那种数据类型来表示时间是一个值的讨论的问题,本文就一起来看下!
1:能用哪些数据类型
1:字符串:不要用,占用空间大,至少需要19个字节,且无法使用日期相关函数
2:Datetime,可考虑
3:Timestamp,可考虑
4:整数,可考虑
1.1:字符串
最好不要使用,占用空间大,且无法使用日期相关函数处理。
1.2:Datetime
与时区无关,保存多少就是多少,最大表示9999年,占用空间5~8字节。
1.3:Timestamp
与时区有关,占用空间4~7字节,最大表示到2038年,且在所在行更新时,该字段会自动更新为最后一次更新的时间,像"修改时间"这类标识数据行修改时间的列可考虑选择Timestamp数据类型,另外如果需要时区信息的话,也可以考虑使用该数据类型。
下面看下时区相关测试:
- 查看当前时区
- 创建数据
CREATE TABLE `time_zone_test` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`date_time` datetime DEFAULT NULL,`time_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO time_zone_test(date_time,time_stamp) VALUES(NOW(),NOW());
- 查看数据
- 修改时区为东7区在查看时间
SET time_zone='+7:00';
可以看到timestamp的字段在原来东八区的基础上减了一个小时。
1.4:整数值
占用4个字节,对占用空间敏感的业务,可考虑使用,然后在程序中做转换即可,或者使用MySQL函数转换,如下使用MySQL函数转换:
最后看下对比:
写在后面
参考文章列表
美团面试:MySQL 保存日期用哪种数据类型?Datetime?Timestamp?数值时间戳? 。