zoukankan      html  css  js  c++  java
  • [MySQL] timestamp和datetime的区别

    建表语句如下:

    create table strong_passwd_whitelist(
      id int unsigned not null auto_increment,
      email_id int unsigned not null default 0,
      update_date timestamp,
      create_date datetime not null default current_timestamp,
      primary key(id),
      key index_email_id(email_id)
    ) engine=innodb charset=utf8;

    1、  timestamp占用4个字节;

      datetime占用8个字节;


    2、  timestamp范围1970-01-01 00:00:01.000000 到 2038-01-19 03:14:07.999999;

      datetime是1000-01-01 00:00:00.000000 到 9999-12-31 23:59:59.999999;

      注意:timestamp存储时在超过存储范围的时候会报错

      


    3、  timestamp默认支持not null default CURRENT_TIMESTAMP自动更新当前时间;

      datetime 在5.6版本后才支持,需要手动指定not null default CURRENT_TIMESTAMP;

      


    4、  timestamp转成utc(世界标准时间)存储,查询再自动转回来;

      datetime原样存储

    timestamp为啥只到2038?

    先看看mysql如何存储的:

    对于timestamp,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。底层表示是时间戳。什么是时间戳?

    时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至某一时间点的总秒数。

    例如北京时间2018-12-08 00:00:00的时间戳是1544198400,就是指从北京时间1970-01-01 08:00:00到2018-12-08 00:00:00已经过去了1544198400秒。

    MySQL的timestamp类型是4个字节,最大值是2的31次方减1,也就是2147483647,转换成北京时间就是2038-01-19 11:14:07

    要想大于这个时间,就用datetime   

    datetime是常量,而timestamp受time_zone设置的影响,只有当将来可能 - 跨时区同步集群时,这才有意义。timestamp一般用于跟踪记录被更新的时间或创建时间.

    基于项目考虑,以上因素不会影响到业务,所以果断换成datetime。

  • 相关阅读:
    Java 嵌套循环之九九乘法表
    Java switch语句第二种用法
    Java switch语句
    Java if-else if-else多选择结构代码
    Java if else双选择结构之计算圆的面积和周长
    Java if单选择结构---掷色子游戏
    在webstorm11中使用nodejs库的智能提示功能
    Node.JS 学习路线图
    Nodejs系列课程,从入门到进阶帮你打通全栈
    使用supervisor提高nodejs调试效率
  • 原文地址:https://www.cnblogs.com/starfish29/p/10627953.html
Copyright © 2011-2022 走看看