注意:从5.6.4版本开始,TIME,TIMESTAMP,DATTIME这三种类型增加了对小数秒的支持,timestamp存储大小为4Bytes+小数部分;datetime存储大小为5Bytes+小数部分。详见:

Date and Time Data Type Representation

#验证了TIMESTAMP类型采用INT存储,具体差8小时原因,请查看1:时区部分

mysql> SELECT FROM_UNIXTIME(0);

+---------------------+

| FROM_UNIXTIME(0) |

+---------------------+

| 1970-01-01 08:00:00 |

+---------------------+

1 row in set (0.00 sec)

mysql> SELECT FROM_UNIXTIME(2147483647);

+---------------------------+

| FROM_UNIXTIME(2147483647) |

+---------------------------+

| 2038-01-19 11:14:07 |

+---------------------------+

1 row in set (0.00 sec)

相同点:

a、两者都可以表示时间精确到秒且显示格式都为:YYYY-MM-DD HH:MM:SS

不同点:

a、TIMESTAMP长度4字节而DATETIME长度8字节,比较节省存储空间

b、TIMESTAMP类型采用INT存储,排序效率更高,查询速度更快,方便计算

c、TIMESTAMP有效范围是1970-2038,而DATETIME有效范围是1000-9999

d、TIMESTAMP类型有默认行为,而DATETIME则没有

e、TIMESTAMP类型会受时区的影响,而DATETIME则不会(

见案例六)

f、TIMESTAMP类型会受SQL_MODE的影响,而DATETIME则不会

4:TIMESTAMP类型的默认行为

4.1:默认行为规则如下:

a、如果TIMESTAMP列没有明确声明NULL属性,则默认是NOT NULL(如果是其他的数据类型,如果没有明确声明NULL属性则默认为NULL)

b、表中的第一个TIMESTAMP字段,如果没有明确声明NULL、DEFAULT、ON UPDATE会自动分配DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP属性(

见案例一)

c、表中的第二个及以后TIMESTAMP字段,如果没有明确声明NULL、DEFAULT会默认分配'0000-00-00 00:00:00'属性(

见案例二)

4.2:使用规则如下:

a、在INSERT或者UPDATE语句中设置了TIMESTAMP字段为NULL时,若该字段允许为NULL,则结果为NULL;若该字段不允许为NULL,则结果为当前的时间戳,

跟DEFAULT没有关系(

见案例四)

b、在INSERT时若缺省(即INSERT语句不指定该列的值),则结果为默认值,具体值由DEFAULT决定(

见案例五)

c、若有一个字段属性是ON UPDATE CURRENT_TIMESTAMP,则修改该行的任何字段都会更新此TIMESTAMP字段为当前时间戳。

4.3:默认行为的特殊限制

a、5.1和5.5版本每张表只能有一个DEFAULT CURRENT_TIMESTAMP类型的TIMESTAMP字段,如果多了会报错:there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause(

见案例三)

b、5.6和5.7则没有这个限制:每张表可以由多个DEFAULT CURRENT_TIMESTAMP类型的TIMESTAMP字段

c、参数explicit_defaults_for_timestamp(释义:显示指定TIMESTAMP类型)可以控制TIMESTAMP类型的默认行为,默认是OFF,即使用默认行为,不手动显示指定

4.4:案例篇

默认行为规则+使用规则+特殊限制放在一起晕了没?我们少废话,上案例

a、案例一:

验证了4.1-b的默认行为

mysql> #执行SQL

mysql> CREATE TABLE tab(

-> id BIGINT unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,-> db_create_time TIMESTAMP-> )ENGINE=INNODB DEFAULT CHARSET=UTF8;

Query OK, 0 rows affected (0.01 sec)

mysql> #SHOW CREATE TABLE查看

mysql> #5.5版本 & 5.6版本 & 5.7版本

mysql> SHOW CREATE TABLE tab\G

*************************** 1. row ***************************

Table: tab

Create Table: CREATE TABLE `tab` (

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`db_create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

b、案例二:

验证了4.1-bc的默认行为

mysql> #执行SQL

mysql> CREATE TABLE tab1(

-> id BIGINT unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,-> db_create_time TIMESTAMP,-> db_update_time TIMESTAMP-> )ENGINE=INNODB DEFAULT CHARSET=UTF8;

Query OK, 0 rows affected (0.01 sec)

mysql> #SHOW CREATE TABLE查看

mysql> #5.5版本 & 5.6版本 & 5.7版本

mysql> SHOW CREATE TABLE tab1 \G

*************************** 1. row ***************************

Table: tab1

Create Table: CREATE TABLE `tab1` (

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`db_create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`db_update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

c、案例三:

验证了4.3-a的特殊限制

mysql> #执行SQL

mysql>CREATE TABLE tab2(

-> id BIGINT unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,-> db_create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,-> db_update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP-> )ENGINE=INNODB DEFAULT CHARSET=UTF8;Query OK, 0 rows affected (0.01 sec)

mysql> #SHOW CREATE TABLE查看

mysql> #5.6版本 & 5.7版本

mysql> SHOW CREATE TABLE tab2 \G

*************************** 1. row ***************************

Table: tab2

Create Table: CREATE TABLE `tab2` (

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`db_create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`db_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

#5.5版本报错了(MySQL5.5版本不支持多个DEFAULT CURRENT_TIMESTAMP属性的字段)

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

d、案例四:

验证了4.2-a的使用规则

#5.5版本 & 5.6版本 & 5.7版本

mysql> #执行SQL

mysql> CREATE TABLE tab3(

-> id BIGINT unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,

-> db_create_time TIMESTAMP NOT NULL DEFAULT '2000-01-01 00:00:00'

-> )ENGINE=INNODB DEFAULT CHARSET=UTF8;

Query OK, 0 rows affected (0.00 sec)

mysql> SHOW CREATE TABLE tab3 \G

*************************** 1. row ***************************

Table: tab3

Create Table: CREATE TABLE `tab3` (

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`db_create_time` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00',PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.01 sec)mysql> INSERT INTO tab3 VALUES(1,NULL);

Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tab3;

+----+---------------------+

| id | db_create_time |

+----+---------------------+

| 1 | 2017-06-29 22:46:53 |

+----+---------------------+

1 row in set (0.01 sec)

本文来自网易实践者社区,经作者葛崇授权发布。

mysql timestamp 类型_MySQL中“诡异”的TIMESTAMP数据类型相关推荐

  1. mysql高精度类型_mysql中常见的数据类型

    2.浮点数 如果希望保证值比较准确,推荐使用定点数数据类型.MySql中的浮点类型有float,double和real.他们定义方式为:FLOAT(M,D) . REAL(M,D) . DOUBLE ...

  2. mysql decimal 类型_MySQL中decimal类型用法的简单介绍

    MySQL中支持浮点数的类型有FLOAT.DOUBLE和DECIMAL类型,DECIMAL 类型不同于FLOAT和DOUBLE,DECIMAL 实际是以串存放的.DECIMAL 可能的最大取值范围与D ...

  3. mysql 命令类型_mysql 基本命令(3)-数据类型和运算符

    一.数值类型 1.数据类型有:数值类型.日i期类型.字符串类型. 2.int(20),int 指整数的取值范围,里面的参数20,只是表示数据显示的宽度.显示宽度和数据类型的取值范围是无关的.显示宽度只 ...

  4. mysql的timestamp类型_MySQL数据库中的timestamp类型与时区

    MySQL的timestamp类型时间范围between '1970-01-01 00:00:01' and '2038-01-19 03:14:07',超出这个范围则值记录为'0000-00-00  ...

  5. mysql中有time吗_mysql中 datatime与timestamp的区别说明

    mysql中有三种日期类型: date(年-月-日) create table test(hiredate date); datetime(日期时间类型) create table test(hire ...

  6. php和mysql时间类型,MySQL_Mysql中的Datetime和Timestamp比较,mysql中用于表示时间的三种类 - phpStudy...

    Mysql中的Datetime和Timestamp比较 mysql中用于表示时间的三种类型date, datetime, timestamp (如果算上int的话,四种) 比较容易混淆,下面就比较一下 ...

  7. mysql timestamp 类型_MySQL timestamp类型

    在本教程中,您将了解MySQL TIMESTAMP和TIMESTAMP列的功能,如使用时间戳自动初始化和更新. MySQL TIMESTAMP简介 MySQL TIMESTAMP是一种保存日期和时间组 ...

  8. 数组在mysql中是什么类型_MySQL 中的数据类型介绍

    1.概述 要了解一个数据库,我们也必须了解其支持的数据类型. MySQL支持所有标准的SQL数据类型,主要分3类: 数值类型 字符串类型 时间日期类型 另一类是几何数据类型,用的不多,也没多介绍.  ...

  9. created at mysql类型_mysql中Invalid default value for 'created_at'问题汗血宝马

    环境 mac + mysql 问题 在创建表的时候遇到了Invalid default value for 'created_at'的错误,不知道什么原因造成的. CREATE TABLE `test ...

最新文章

  1. 卷积神经网络要点解析
  2. web实现QQ第三方登录 开放平台-web实现QQ第三方登录
  3. ubuntu虚拟机开机无法进入系统(initramfs)
  4. optXXX方法,optBoolean
  5. 《系统集成项目管理工程师》必背100个知识点-28范围管理计划和需求管理计划...
  6. 【BZOJ 1877】 [SDOI2009]晨跑(费用流)
  7. google设置在新标签页打开的方法
  8. android元素离边框间距,RecyclerView Item 的分割线 距边框距离问题总结
  9. php swoole编译,php+swoole+redis源码编译安装
  10. JUnit:在参数化测试中命名单个测试用例
  11. app 应用商店系统php,GitHub - ChhXin/appstore-admin: 基于ThinkPHP的应用商店后台管理系统...
  12. oracle 中增加行,Oracle中实现FORM表单插入、锁定、更新行、删除行的包
  13. CUDA C编程权威指南 第三章 CUDA执行模型
  14. BI工具选型需考虑哪些问题
  15. Mac软件下载提示:“已损坏,无法打开”解决办法
  16. 大学英语四六级13年12月大改革应对办法全套复习规划
  17. C语言随机获取小写字母
  18. 计算机考研复习资料推荐(转载)
  19. 使用GoldenGate完成MySQL到MySQL的同步
  20. 三款软件,让你的文字转语音更简单

热门文章

  1. C#中判断某软件是否已安装
  2. MYSQL limit,offset 区别
  3. Git基础-获取仓库、提交、查看历史、撤销
  4. 20140710文安c++面试总结
  5. sql server之数据库语句优化
  6. 2013年2月28日星期四
  7. selenium search
  8. linux下arp***的解决方案[转]
  9. 在电商运营中与客户建立信任的4种方法
  10. 【转载】SAP表修改概览