这片博客来详细分区一下这哥俩!

首先来说明这两个字符类型:

DATETIME 8 1000-01-01 00:00:00 ~9999~12-31 23:59:59 0000-00-00 00:00:00
TIMESTAMP(包含时区信息) 4 1970-01-01 08:00:01~2038-01-19 11:14:07 0000-00-00  00:00:00

如上直观的看到timestamp类型占用了更少的字节,但是timestamp表示的时间却是有限的。

这两个值都可以自动初始化并且更新为当前的时间戳,对于表中的任何TIMESTAMP或 DATETIME列,您可以将当前时间戳分配为默认值,自动更新值或两者:

首先说这两个类型都可以做的事: 这两个类型都可以设置默认值,也都可以设置自动更新。下面举例说明。

  1. create table tb5(
  2. t1 datetime default current_timestamp on update current_timestamp, #设置为当前时间戳为默认值,并且自动更新
  3. t2 datetime default current_timestamp, #仅设置当前时间戳为默认值
  4. t3 timestamp default current_timestamp on update current_timestamp,
  5. t4 timestamp default current_timestamp,
    t5 varchar(10),
  6. t6 int auto_increment not null primary key)

当向表中插入一条数据时,t1~t4会插入当前时间戳的默认值!

  1. mysql> insert into tb5(t5) select NULL;
  2. Query OK, 1 row affected (0.05 sec)
  3. Records: 1 Duplicates: 0 Warnings: 0
  4.  
  5. mysql> select * from tb5; #t1~t4因为是以当前时间戳为默认值的,因此相等。
  6. +---------------------+---------------------+---------------------+---------------------+------+----+
  7. | t1 | t2 | t3 | t4 | t5 | t6 |
  8. +---------------------+---------------------+---------------------+---------------------+------+----+
  9. | 2019-01-09 13:58:10 | 2019-01-09 13:58:10 | 2019-01-09 13:58:10 | 2019-01-09 13:58:10 | NULL | 1 |
  10. +---------------------+---------------------+---------------------+---------------------+------+----+
  11. 1 row in set (0.00 sec)
  12.  
  13. mysql>

下面我们修改插入的这一行数值,就可以发现不同了!

  1. mysql> update tb5 set t5="a" where t6=1;
  2. Query OK, 1 row affected (0.01 sec)
  3. Rows matched: 1 Changed: 1 Warnings: 0
  4.  
  5. mysql> select * from tb5; #看到了什么不一样的地方。t1和t3的值会自动修改,而t2和t4的值不会的。
  6. +---------------------+---------------------+---------------------+---------------------+------+----+
  7. | t1 | t2 | t3 | t4 | t5 | t6 |
  8. +---------------------+---------------------+---------------------+---------------------+------+----+
  9. | 2019-01-09 14:00:49 | 2019-01-09 13:58:10 | 2019-01-09 14:00:49 | 2019-01-09 13:58:10 | a | 1 |
  10. +---------------------+---------------------+---------------------+---------------------+------+----+
  11. 1 row in set (0.00 sec)

default current_timestamp: 只是会设置字段值为当前时间戳,不会随着记录中其他字段的更新而更新。

on update current_timestamp: 则是表示字段值,会随着记录中其他字段值更新而更新为当前时间戳。

官方文档上说timestamp默认数值为0,datetime默认值为null,但是下面语句却执行失败!

  1. create table tb6(
  2. t1 datetime on update current_timestamp,
  3. t2 datetime not null on update current_timestamp,
  4. t3 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  5. t4 timestamp null on update current_timestamp,
  6. t5 varchar(10),
  7. t6 int auto_increment not null primary key
  8. )
  9.  
  10. #错误提示就是Error Code: 1067. Invalid default value for 't3'

上面的t1和t3只要有对应记录中字段数值的改变那么t1和t3的值就会更新。如果想不让他们自动自动更新,除了修改其默认属性(也就是不添加on update current_timestamp)外,MySQL还有一个变量控制这个行为:explicit_defaults_for_timestamp,其默认值为

  1. mysql> show variables like "%explicit%";
  2. +---------------------------------+-------+
  3. | Variable_name | Value |
  4. +---------------------------------+-------+
  5. | explicit_defaults_for_timestamp | OFF |
  6. +---------------------------------+-------+
  7. 1 row in set (0.00 sec)
  8.  
  9. #默认数值为off,把其设置为on即可!

测试一下:

  1. mysql> set global explicit_defaults_for_timestamp="ON"; #设置这个参数值为ON
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> set session explicit_defaults_for_timestamp="ON";
  5. Query OK, 0 rows affected (0.00 sec)
  6.  
  7. mysql> show variables like "%explicit%";
  8. +---------------------------------+-------+
  9. | Variable_name | Value |
  10. +---------------------------------+-------+
  11. | explicit_defaults_for_timestamp | ON |
  12. +---------------------------------+-------+
  13. 1 row in set (0.01 sec)
  14.  
  15. mysql> insert into tb5(t5) select NULL; #插入数据,
  16. Query OK, 1 row affected (0.00 sec)
  17. Records: 1 Duplicates: 0 Warnings: 0
  18.  
  19. mysql> select * from tb5; #查看其第二行的数据
  20. +---------------------+---------------------+---------------------+---------------------+------+----+
  21. | t1 | t2 | t3 | t4 | t5 | t6 |
  22. +---------------------+---------------------+---------------------+---------------------+------+----+
  23. | 2019-01-09 14:00:49 | 2019-01-09 13:58:10 | 2019-01-09 14:00:49 | 2019-01-09 13:58:10 | a | 1 |
  24. | 2019-01-09 14:44:08 | 2019-01-09 14:44:08 | 2019-01-09 14:44:08 | 2019-01-09 14:44:08 | NULL | 2 |
  25. +---------------------+---------------------+---------------------+---------------------+------+----+
  26. 2 rows in set (0.00 sec)
  27.  
  28. mysql> update tb5 set t5="b" where t6=2; #更改第二行的字段值
  29. Query OK, 1 row affected (0.01 sec)
  30. Rows matched: 1 Changed: 1 Warnings: 0
  31.  
  32. mysql> select * from tb5; #可以看到t1和t3的值还是自动更新了
  33. +---------------------+---------------------+---------------------+---------------------+------+----+
  34. | t1 | t2 | t3 | t4 | t5 | t6 |
  35. +---------------------+---------------------+---------------------+---------------------+------+----+
  36. | 2019-01-09 14:00:49 | 2019-01-09 13:58:10 | 2019-01-09 14:00:49 | 2019-01-09 13:58:10 | a | 1 |
  37. | 2019-01-09 14:44:41 | 2019-01-09 14:44:08 | 2019-01-09 14:44:41 | 2019-01-09 14:44:08 | b | 2 |
  38. +---------------------+---------------------+---------------------+---------------------+------+----+
  39. 2 rows in set (0.00 sec)

原因是什么?explicit_defaults_for_timestamp的数值会影响表结构,当表结构已经创建,那么再设置这个数值是不会起作用的。并且在定义的时候不需要显示指定on update current_timestamp参数。

可以参考这片博客:https://www.cnblogs.com/JiangLe/p/6956865.html

二者的不同

上面提到的都是这两个类型都可以做的事,下面来说明二者的不同之处。

1:上面已经提到的二者占用的大小不同,datetime占用8个字节,而timestamp占用4个字节。

2:还有就是表示的时间范围不同。

3:timestamp的时间显示值依赖于时区;如果在多个时区存储或访问数据,timestamp和datetime的行为将很不一样。timestamp提供的数值和时区有关系,而datetime则是文本表示的日期和时间。

除了特殊的行为,通常也应该尽量使用TIMESTAMP。

如果要存储比秒更小粒度的日期和时间怎么办?MySQL目前没有提供合适的数据类型,但是可以使用自己的存储格式;可以使用BIGINT类型存储微妙级别的问题,或者使用DOUBLE存储秒之后的小数部分。也可以使用mariadb或者percona server。

MySQL字符类型datetime与timestamp的更多相关文章

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

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

  2. 【blog】mysql字段类型datetime和timestamp的区别

    首先 DATETIM和TIMESTAMP类型所占的存储空间不同,前者8个字节,后者4个字节,这样造成的后果是两者能表示的时间范围不同.前者范围为1000-01-01 00:00:00 ~ 9999-1 ...

  3. MySQL中的datetime与timestamp比较-------转载

    原文地址http://database.51cto.com/art/200905/124240.htm MySQL中的datetime与timestamp比较 本文将通过实例比较MySQL中的date ...

  4. MySQL5日期类型DATETIME和TIMESTAMP相关问题详解

    MySQL5日期类型DATETIME和TIMESTAMP相关问题详解 MySQL5的日期类型有三种:DATETIME.DATE和TIMESTAMP,除了DATE用来表示一个不带时分秒的是日期,另外两个 ...

  5. mysql字符类型大小写敏感的讨论

    mysql字符类型默认是不区分大小写的,即select * from t where name='AAA'与='aaa'没区别,以下是测试的例子 (root)); (root,,,,'BbB'); ( ...

  6. MySql中的时间类型datetime,timestamp,date,year比较

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

  7. mysql中 date datetime time timestamp 的区别

    MySQL中关于时间的数据类型:它们分别是 date.datetime.time.timestamp.year date :"yyyy-mm-dd"  日期     1000-01 ...

  8. mysql string types ---- mysql 字符类型详解

    一.mysql 中包涵的字符类型: [national] char [(m)] [character set charset_name] [collate collation_name] [natio ...

  9. mysql字符类型

    字符类型 #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的参数指的都是字符的长度 #char类型:定 ...

随机推荐

  1. sap gui 定义类并实现接口

    1: 直接在类属性的interfaces 框输入 接口名称即可.

  2. ie6-ie8支持CSS3选择器的解决办法

    引入nwmatcher.js和selectivizr.js <!--[if lt IE 10]> <script src="html5shiv.js">&l ...

  3. iOS UI基础-11.0 UINavigationController

    导航控制器 利用UINavigationController,可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型例子就是系统自带的“设置”应用 UINavigationController的使用 ...

  4. 记录一则expdp任务异常处理案例

    环境:AIX 6.1 + Oracle 10.2.0.4 现象:在XTTS迁移测试阶段,遇到执行几个expdp的导出任务,迟迟没有返回任何信息,对应日志无任何输出,查看任务状态: SQL> se ...

  5. 输出调试技巧 PRINTF()

    #define PRINTF(...) \ do { \ printf( "%d:%s::",__LINE__, __FUNCTION__);\ printf(__VA_ARGS_ ...

  6. DataGridView控件用法合集

    1.当前的单元格属性取得.变更 Console.WriteLine(DataGridView1.CurrentCell.Value) Console.WriteLine(DataGridView1.C ...

  7. oracle 修改表结构,增加列,删除列等

    增加一列:ALTER TABLE yourTabbleName ADD columnName dataType; 增加多列:ALTER TABLE yourTabbleName ADD (column ...

  8. python subprocess中ssh命令的特殊性

    今天尝试使用python 的 subprocess 模块 使用类似如下语句: p=subprocess.Popen(['ssh','root@localhost'],stdout=subprocess ...

  9. Python全栈-day14-模块和包

    一.模块 1.模块 1)定义 一系列功能的集合体,在Python中py文件就是一个模块 2)模块的类别 a.使用Python编写的py文件 b.已经被编译成共享库或者DLL的C 或者 C++ 扩展 c ...

  10. jQuery事件--change([[data],fn])、on(events,[selector],[data],fn)和hover([over,]out)

    change([[data],fn]) 概述 当元素的值发生改变时,会发生 change 事件. 该事件仅适用于文本域(text field),以及 textarea 和 select 元素.当用于 ...