一  前言
  昨天在给开发同学做数据库设计规范分享的时候,讲到时间字段常用的有三个选择datetime、timestamp、int,应该使用什么类型的合适?本文通过三种类型的各个维度来分析,声明:本文没有具体的结论,但是会给一个推荐使用方式,需要使用者结合自己的业务场景来具体选择。

二 分析
int型:
存储长度: 4字节
表示范围: date('Y-m-d H:i:s', 4294967295) 最大到 2106-02-07 14:28:15 ,如果一个企业活过这么久,就需要数据库考虑 bigint 或者datetime类型了。
是否为空: 可以为空,但是业务逻辑设计建议设置非空
存储格式: 数值类型存储,节省空间
时区相关: 与时区无关
默认值 :  可以根据业务逻辑设置默认值为某个时间。
优点
  1 类型简单,cpu处理该字段的运算会比较快,占用字节小,节省空间。
  2 查询速度快。

datetime:
存储长度: 8字节
表示范围:'1000-01-01 00:00:00'-'9999-12-31 23:59:59'
是否为空: 允许为空值,可以自定义值,且insert和update操作不会自动修改其值。
储存格式: 以实际格式存储(Just stores what you have stored and retrieves the same thing which you have stored.)
时区相关: 与时区无关
默认值  : 不指定默认值的时候 MySQL会初始化为'0000-00-00 00:00:00'

mysql> CREATE TABLE `tm` (
-> `d1` int(10) unsigned NOT NULL default '',
-> `d2` timestamp NOT NULL default CURRENT_TIMESTAMP,
-> `d3` datetime NOT NULL,
-> `d4` timestamp NOT NULL default CURRENT_TIMESTAMP on update current_timestamp
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into tm(d1,d4) values(1458612980,now());
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from tm;
+------------+---------------------+---------------------+---------------------+
| d1 | d2 | d3 | d4 |
+------------+---------------------+---------------------+---------------------+
| 1458612980 | 2016-03-22 10:16:20 | 2016-03-22 15:21:21 | 2016-03-22 10:16:20 |
| 1458612980 | 2016-03-22 15:22:17 | 0000-00-00 00:00:00 | 2016-03-22 15:22:17 |
+------------+---------------------+---------------------+---------------------+
2 rows in set (0.00 sec)

优点 显示直观,不需使用函数做转换
 
timestamp:
存储长度: 4字节
是否为空: 允许为空值,但是不可以自定义值,所以为空值时没有任何意义。
表示范围:'1970-01-01 00:00:01'-'2038-01-19 03:14:07
是否为空: 允许为空值,可以自定义值,且insert和update操作不会自动修改其值。
存储格式: 值以UTC格式保存,即以毫秒为单位的数字存储 ( it stores the number of milliseconds)
时区相关: 和时间相关,时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区。
默认值 :  可以设置为CURRENT_TIMESTAMP(),当前的系统时间。
gmt_modified timestamp not null default '0000-00-00 00:00:00' on update current_timestamp
字段属性加上 "on update current_timestamp",
1 在更新记录时不指定update timestamp字段的值,数据库会自动修改gmt_modified的值为当前系统的时间,
2 在插入记录时不指定timestamp字段和timestamp字段的值,插入后该字段的值会自动变为当前系统时间。
相比于 init 类型的 可以自动更新为系统当前时间,其他并无优势。
三 总结
 对于如何选型 ,有如下三种层面 性能,存储空间,时间范围 的考虑。这里我从时间范围和存储空间层面推荐使用 int 或者bigint ,datetime 类型。bigint和datetime 占用的空间一样,唯一的差异是在性能上可能存在差异。当然如果你服务的企业有存在  102年的梦想,那我建议直接使用 datetime类型。2038年的时候,虽然我们(80后)估计已经在家养老或者身居高层,为了避免给后来的运维人员留坑,建议不要使用 timestamp 字段。
四 推荐阅读

datatime和timstmap初始化 
datetime官方文档 
说说time_zone 带来的性能问题

【转】【MySQL】时间类型存储格式选择的更多相关文章

  1. MySQL日期数据类型、MySQL时间类型使用总结

    MySQL:MySQL日期数据类型.MySQL时间类型使用总结 MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型 存储空间 日期格式 日期范围 ------------ --- ...

  2. mysql 时间类型分类

    MySQL:MySQL日期数据类型.MySQL时间类型使用总结 MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型 存储空间 日期格式 日期范围------------ ---- ...

  3. mysql 时间类型datetime与timestamp区别比较

    mysql 时间类型datetime与timestamp区别比较 相同点: 显示宽度和格式相同,显示宽度固定在19字符,格式为YYYY-MM-DD HH:MM:SS. 不同点: (1)时间范围不同: ...

  4. MySQL 时间类型字段的分析

    日期类型                存储空间               日期格式                                           日期范围---------- ...

  5. MySQL:MySQL日期数据类型、MySQL时间类型使用总结

    MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型        存储空间      日期格式                日期范围------------  -------- ...

  6. mysql时间类型和格式转换

    内容目录 简介mysql时间类型DATE_FORMAT()函数 简介 今天开发中,做一个功能需要对历史数据进行补充,相信大家也遇到过这样的情况,这个历史数据需要按月份和人的id进行区分,于是想到了my ...

  7. MySQL时间类型及获取、展示处理

    MySQL时间格式 mysql所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值 ...

  8. Mysql时间类型处理

    关于Mysql中时间的处理 最近在读<人类简史>,读第二遍.只有晚上睡觉之前读一点点,有时候觉得一天可以抽出一个专门的时间来看书了,效率应该能高不少. 另外分享个网址可以随心创作 这里有一 ...

  9. mysql 时间类型精确到毫秒、微秒及其处理

    一.MySQL 获得毫秒.微秒及对毫秒.微秒的处理 MySQL 较新的版本中(MySQL 6.0.5),也还没有产生微秒的函数,now() 只能精确到秒. MySQL 中也没有存储带有毫秒.微秒的日期 ...

随机推荐

  1. Shell教程 之数组

    1.定义数组 数组中可以存放多个值.Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似). 与大部分编程语言类似,数组元素的下标由0开始. Shell ...

  2. Lua的闭包详解(终于搞懂了)

    词法定界:当一个函数内嵌套另一个函数的时候,内函数可以访问外部函数的局部变量,这种特征叫做词法定界 table.sort(names,functin (n1,n2) return grades[n1] ...

  3. cipher的各个模式

    block cipher 工作模式(引自百度)Electronic Codebook Mode 最经典的模式,把明文按64比特为单位分为block, 对所有block使用同样的密钥来加密,最后把输出的 ...

  4. cmd乱码问题

    1.进入 cmd 窗口 2.字符编码切换回中文:chcp 936 MS-DOS为以下国家和语言提供字符集:  代码页描述  1258 越南语  1257 波罗的语  1256 阿拉伯语  1255 希 ...

  5. python颜色及背景

    linux终端中的颜色是用转义序列控制的,转义序列是以ESC开头,可以用\033完成相同的工作(ESC的ASCII码用十进制表示就是27,等于用八进制表示的33). 书写格式,和相关说明如下: 1 2 ...

  6. A Spectral Technique for Correspondence Problems Using Pairwise Constraints

    Abstract 我们提出了一种有效的谱方法来寻找两组特征之间的一致对应关系.我们建立了一个图的邻接矩阵M,它的节点代表了潜在的对应,而链接上的权重代表潜在的对应之间的成对协议.正确的分配可在彼此之间 ...

  7. 【gRPC使用问题1】gRPC的proto内import其他proto导致的一次小坑

    1.对于一些proto里面的定义,如果包含了 引入其他proto文件的 proto文件来说,生成的时候要注意.尤其是 引入的是官方框架内的 proto文件,如果自己没有提供的话,生成代码会报错! 具体 ...

  8. Materix3*3

    ][],][],][]) { ;i<;i++) { ;j<;j++) { res[i][j]= aa[i][] * bb[][j] + aa[i][] *bb[][j] + aa[i][] ...

  9. Linux_(4)Shell编程(下)

    五.shell流程控制1.一重分支if 语句语法格式:if condition then command1 fi末尾的fi就是if倒过来. 写成一行: if condition; then comma ...

  10. nim博弈

    尼姆博弈 1.问题模型:有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 2.解决思路:用(a,b,c)表示某种局势,显证(0,0,0)是第一种奇异 ...