美文网首页
MySQL 的 timestamp 和 datetime 类型比

MySQL 的 timestamp 和 datetime 类型比

作者: 流浪狗matteao | 来源:发表于2019-11-04 21:13 被阅读0次

    前言

    最近做项目的时候,发现对mysqltimestampdatetime 的区别认识不清,所以建了一个测试表,测试了一下区别。另外,我在社区搜索相关文章时,没有发现针对性的文章,所以写出来。

    测试环境

    mysql 5.7 + phpmyadmin

    测试步骤

    • 插入数据时,timestampdatetime的表现
    • 更新数据时,timestampdatetime的表现
    • 更改mysql 的time_zone 值,timestampdatetime的表现

    测试数据表

    1240 (3).png

    其中字段datetime1 是datetime类型, 字段timestamp1, timestamp2, timestamp3 是timestamp类型。

    • 有以下区别:
    1. datetime类型 可以设置默认值,也可以不设置
    2. 第一个timestamp类型的默认值自动变为 CURRENT_TIMESTAMP, 约束为 ON UPDATE CURRENT_TIMESTAMPCURRENT_TIMESTAMP 是mysql 的变量,值是当前时间。
    3. 其他timestamp类型的默认值自动变为0000-00-00 00:00:00

    字段默认值调整

    为了有差异,我把字段timestamp3 的默认值更改为 CURRENT_TIMESTAMP。这样, 字段timestamp1和timestamp3的区别变成了ON UPDATE CURRENT_TIMESTAMPCURRENT_TIMESTAMP的区别

    1240 (4).png

    插入数据

    timestamp 类型

    INSERT INTO `datetest`(`id`, `datetime1`, `timestamp1`, `timestamp2`, `timestamp3`) VALUES (1, now(), null, null, null);
    INSERT INTO `datetest`(`id`, `datetime1`) VALUES (2, now());
    

    结果:

    1240 (5).png
    • 小结:

    插入数据, timestamp类型的传值为null时, 会自动变为当前时间

    更新数据

    UPDATE `datetest` SET `datetime1`=now(),`timestamp1`= null ,`timestamp2`= null,`timestamp3`= null WHERE id = 1;
    UPDATE `datetest` SET `datetime1`=now() WHERE id = 2;
    

    结果:


    1240 (6).png
    • 小结:

    更新数据, timestamp类型没传值时,默认值为ON UPDATE CURRENT_TIMESTAMP的timestamp, 会更新为当前时间。以 CURRENT_TIMESTAMP 或者0000-00-00 00:00:00 为默认值的timestamp不会更新。

    更改time_zone 值

    set time_zone = "+9:00";
    INSERT INTO `datetest`(`id`, `datetime1`, `timestamp1`, `timestamp2`, `timestamp3`) VALUES (4, now(), null, null, null);
    show VARIABLES like "time_zone";
    
    1240 (7).png 1240 (8).png
    • 小结:

    更改时区后, 改为+9:00时区后, datetime类型的小时 数值+1, timestamp类型的值不变。说明:timestamp存储的是UTC时间,然后显示的是根据当前时区的转换时间;datetime类型 存储的是根据操作数据当时的时区的时间。

    结论

    • datetimetimestamp 类型的表现形式都为:yyyy-mm-dd hh:mm:ss ,其中datetime 占据8字节,timestamp占据4字节
    • datetime 的表示范围 '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999'; timestamp的范围为'1970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.999999'。
    • 插入数据时, timestamp类型的传值为null, 会自动变为当前时间
    • 更新数据时,timestamp类型没传值时,默认值为ON UPDATE CURRENT_TIMESTAMP的timestamp, 会更新为当前时间。以 CURRENT_TIMESTAMP 或者0000-00-00 00:00:00 为默认值的timestamp不会更新。
    • 更改时区后, 改为+9:00时区后, datetime类型的小时 数值+1, timestamp类型的值不变。说明:timestamp存储的是UTC时间,然后显示的是根据当前时区的转换时间;datetime类型 存储的是根据操作数据当时的时区的时间。

    相关文章

      网友评论

          本文标题:MySQL 的 timestamp 和 datetime 类型比

          本文链接:https://www.haomeiwen.com/subject/drkjbctx.html