linux mysql timestamp_MySQL时间类型Timestamp和Datetime 的深入理解

MySQL数据库常用的时间类型有timestamp和datetime,两者主要区别是占用存储空间长度不一致、可存储的时间也有限制,但针对不同版本下,timestamp字段类型的设置需要慎重,因为不注意的可能会被“坑死”。

一、TIMESTAMP和DATETIME字段类型对比

字段类型

存储长度

时间范围

备注

timestamp

4字节

'1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC

datetime

8字节(5.7占5字节)

'1000-01-01 00:00:00' to '9999-12-31 23:59:59'

1.timestamp注意事项

(1)5.7版本之前,没有explicit_defaults_for_timestamp 参数(5.7默认开启,timestamp不会设置default值属性),timestamp字段默认存在default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP属性,默认值针对的主要是以下函数产生的时间

These are CURRENT_TIMESTAMP(), NOW(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP, and LOCALTIMESTAMP().

(2)mysql的timestamp值自动从当前时区转换到utc时区存储,并且自动从utc时区转换为当前系统时区检索返回

官方参考文档:https://dev.mysql.com/doc/refman/5.7/en/datetime.html

MySQL converts TIMESTAMP valuesfrom the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval.

(This does not occur for other types such as DATETIME.) By default, the current time zone for each connection is the server's time.

2.datetime注意事项:

在mysql5.7之后,datetime字段也可以指定默认值,并且格式和timestamp一样

CREATE TABLE t1 (

ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

);

DEFAULT0 or DEFAULT '2000-01-01 00:00:00'

二、数据库时区参数

1.system_time_zone

数据库实例启动,从my.cnf配置参数timezone=timezone_name获取,若my.cnf未设置则从操作系统获取环境变量TZ获取

2.time_zone

数据库当前实际使用的时区,默认为system,即系统时区,其设置可以通过set global time_zone=''设置,其中参数值有以下三种形式:'SYSTEM' 、'+10:00' 、'Europe/Helsinki'

Linux时区知识扩展:

Linux将时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟两种。系统时间是指当前Linux Kernel中的时钟,

而硬件时钟则是主板上由电池供电的那个主板硬件时钟,这个时钟可以在BIOS的"Standard BIOS Feture"项中进行设置。

系统时钟:

所有操作系统命令、函数依赖的时钟,独立于硬件时钟运行,可通过date设置

设置系统时间:date-s "2017-08-22 22:58:00"查看时区:date-R

硬件时钟:

Linux启动从系统配置获取

查看硬件时钟:clock--show 、 hwclock --show

设置硬件时钟:hwclock/clock --set --date="月/日/年 时:分:秒"系统时钟同步到硬件:/sbin/clock -w

硬件时钟同步到系统:/sbin/clock -s

时区设置:

修改/etc/sysconfig/clock

ZONE=Asia/Shanghai

rm/etc/localtime

链接到上海时区文件

ln-sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

执行完上述过程后,重启机器,即可看到时区已经更改。

三、实际使用实例

1.不同版本下timestamp和datetime使用实例

(1)测试timestamp和datetime创建带默认值的表

同时执行创建带默认值的SQL语句,发现5.6(不含5.6)之前版本datetime不支持带DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

CREATE TABLE test (

ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

);

5.0.67版本ERROR1067 (42000): Invalid default value for 'dt'

5.5.20版本ERROR1067 (42000): Invalid default value for 'dt'

5.6.22版本Query OK,0 rows affected (0.02sec)5.7.18版本Query OK,0 rows affected (0.00 sec)

(2)测试timestamp和datetime创建表结构类型

不指定默认值的情况下创建表结构,发现5.6(不含5.6)timestamp默认值是CURRENT_TIMESTAMP并且随着记录更新而更新

CREATE TABLE test01 (

ts TIMESTAMP ,

dt DATETIME

);5.0.67版本

CREATE TABLE `test01` (

`ts` timestamp NOT NULLdefaultCURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,

`dt` datetimedefaultNULL

) ENGINE=InnoDB DEFAULT CHARSET=latin15.5.20版本

CREATE TABLE `test01` (

`ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

`dt` datetime DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb45.6.22版本

CREATE TABLE `test01` (

`ts` timestamp NULL DEFAULT NULL,

`dt` datetime DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf85.7.18版本

CREATE TABLE `test01` (

`ts` timestamp NULL DEFAULT NULL,

`dt` datetime DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8

(3)、测试timestamp和datetime类型mysqldump导出导入影响

测试结论为,timestamp数据类型的记录导出会以utc时间格式导出,导入库中自动由UTC格式转为系统默认时区,所以看到导出文件timestamp内容时间戳和实际存储的不相符。

如果需要看到和导入与实际相符的时间戳,需要加入参数--tz-utc=false用于禁止timestamp时区转换,默认是开启的,即导出文件中开头设置的/*!40103 SET TIME_ZONE='+00:00' */;

系统默认是cst时区,数据库参数设置也是CST和SYSTEM,根据系统时间插入数据:

| system_time_zone | CST    |

| time_zone            | SYSTEM |

insert into test01 values(sysdate(),sysdate());5.0.67版本select * fromtest01;+---------------------+---------------------+

| ts | dt |

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

| 2018-01-12 14:15:19 | 2018-01-12 14:15:19 |

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

5.5.20版本select * fromtest01;+---------------------+---------------------+

| ts | dt |

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

| 2018-01-12 14:15:27 | 2018-01-12 14:15:27 |

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

5.6.22版本select * fromtest01;+---------------------+---------------------+

| ts | dt |

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

| 2018-01-07 20:13:22 | 2018-01-07 20:13:22 |

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

5.7.18版本select * fromtest01;+---------------------+---------------------+

| ts | dt |

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

| 2018-01-07 20:13:20 | 2018-01-07 20:13:20 |

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

然后将数据库表test01表利用mysqldump导出

mysqldump dbtest --tables test01 >test01.sql5.0.67版本-- MySQL dump 10.11

--

--Host: localhost Database: dbtest-- ------------------------------------------------------

-- Server version 5.0.67-percona-highperf-log/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE*/;/*!40103 SET TIME_ZONE='+00:00'*/;--

-- Table structure fortable `test01`--DROP TABLE IF EXISTS `test01`;

SET @saved_cs_client=@@character_set_client;

SET character_set_client=utf8;

CREATE TABLE `test01` (

`ts` timestamp NOT NULLdefaultCURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,

`dt` datetimedefaultNULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

SET character_set_client=@saved_cs_client;--

-- Dumping data fortable `test01`--LOCK TABLES `test01` WRITE;/*!40000 ALTER TABLE `test01` DISABLE KEYS*/;

INSERT INTO `test01` VALUES ('2018-01-12 06:15:19','2018-01-12 14:15:19');/*!40000 ALTER TABLE `test01` ENABLE KEYS*/;

UNLOCK TABLES;/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE*/;-- Dump completed on 2018-01-12 6:22:25

5.5.20版本-- MySQL dump 10.13 Distrib 5.5.20, forLinux (x86_64)--

--Host: localhost Database: dbtest-- ------------------------------------------------------

-- Server version 5.5.20-rel24.1-log/*!40101 SET NAMES utf8*/;/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE*/;/*!40103 SET TIME_ZONE='+00:00'*/;--

-- Table structure fortable `test01`--DROP TABLE IF EXISTS `test01`;/*!40101 SET @saved_cs_client = @@character_set_client*/;/*!40101 SET character_set_client = utf8*/;

CREATE TABLE `test01` (

`ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

`dt` datetime DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;/*!40101 SET character_set_client = @saved_cs_client*/;--

-- Dumping data fortable `test01`--LOCK TABLES `test01` WRITE;/*!40000 ALTER TABLE `test01` DISABLE KEYS*/;

INSERT INTO `test01` VALUES ('2018-01-12 06:15:27','2018-01-12 14:15:27');/*!40000 ALTER TABLE `test01` ENABLE KEYS*/;

UNLOCK TABLES;/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE*/;-- Dump completed on 2018-01-12 14:22:32

5.6.22版本-- MySQL dump 10.13 Distrib 5.6.22-71.0, forLinux (x86_64)--

--Host: localhost Database: dbtest-- ------------------------------------------------------

-- Server version 5.6.22-71.0-log/*!40101 SET NAMES utf8*/;/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE*/;/*!40103 SET TIME_ZONE='+00:00'*/;--

-- Table structure fortable `test01`--DROP TABLE IF EXISTS `test01`;/*!40101 SET @saved_cs_client = @@character_set_client*/;/*!40101 SET character_set_client = utf8*/;

CREATE TABLE `test01` (

`ts` timestamp NULL DEFAULT NULL,

`dt` datetime DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;/*!40101 SET character_set_client = @saved_cs_client*/;--

-- Dumping data fortable `test01`--LOCK TABLES `test01` WRITE;/*!40000 ALTER TABLE `test01` DISABLE KEYS*/;

INSERT INTO `test01` VALUES ('2018-01-07 12:13:22','2018-01-07 20:13:22');/*!40000 ALTER TABLE `test01` ENABLE KEYS*/;

UNLOCK TABLES;/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE*/;-- Dump completed on 2018-01-07 20:20:29

5.7.18版本-- MySQL dump 10.13 Distrib 5.7.18-15, forLinux (x86_64)--

--Host: localhost Database: dbtest-- ------------------------------------------------------

-- Server version 5.7.18-15-log/*!40101 SET NAMES utf8*/;/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE*/;/*!40103 SET TIME_ZONE='+00:00'*/;--

-- Table structure fortable `test01`--DROP TABLE IF EXISTS `test01`;/*!40101 SET @saved_cs_client = @@character_set_client*/;/*!40101 SET character_set_client = utf8*/;

CREATE TABLE `test01` (

`ts` timestamp NULL DEFAULT NULL,

`dt` datetime DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;/*!40101 SET character_set_client = @saved_cs_client*/;--

-- Dumping data fortable `test01`--LOCK TABLES `test01` WRITE;/*!40000 ALTER TABLE `test01` DISABLE KEYS*/;

INSERT INTO `test01` VALUES ('2018-01-07 12:13:20','2018-01-07 20:13:20');/*!40000 ALTER TABLE `test01` ENABLE KEYS*/;

UNLOCK TABLES;/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE*/;-- Dump completed on 2018-01-07 20:20:29

删除test01表,并用mysqldump导出文件还原

mysql -D dbtest -e "drop tables test01"mysql-D dbtest

| ts | dt |

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

| 2018-01-12 14:15:19 | 2018-01-12 14:15:19 |

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

5.5.20版本+---------------------+---------------------+

| ts | dt |

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

| 2018-01-12 14:15:27 | 2018-01-12 14:15:27 |

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

5.6.22版本+---------------------+---------------------+

| ts | dt |

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

| 2018-01-07 20:13:22 | 2018-01-07 20:13:22 |

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

5.7.18版本+---------------------+---------------------+

| ts | dt |

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

| 2018-01-07 20:13:20 | 2018-01-07 20:13:20 |

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

(4)ON UPDATE CURRENT_TIMESTAMP属性影响

如果包含ON UPDATE CURRENT_TIMESTAMP属性,则如果对表记录更新,此记录对应的timestamp类型记录也会更新

ts字段是timestamp类型且含有on update current_timestamp属性,dt字段是datetime类型且不含on update current_timestamp属性

更新前:

mysql-D dbtest -e "select * from test01;"

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

| ts | dt | id |

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

| 2018-01-12 14:15:19 | 2018-01-12 14:15:19 | NULL |

+---------------------+---------------------+------+更新:

mysql-D dbtest -e "update test01 set id=1 where id is null"更新后:

mysql-D dbtest -e "select * from test01;"Logging to file'/home/mysql/query.log'

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

| ts | dt | id |

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

| 2018-01-12 15:42:15 | 2018-01-12 14:15:19 | 1 |

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

2.不同版本下mysqldump结束时间分析

使用mysqldump备份的同仁都可能会注意到,正常备份结束的话,在文件结尾会有一条成功结束的表示,即 :-- Dump completed on 2018-01-12  6:22:25。

这个在mysql5.0后可以通过一些参数控制,例如可以加参数--comments=false来禁止添加comments信息,即所有--开头的comment会不记录在备份文件中,也可以增加--dump-date=false来禁止时间戳添加,即只包含-- Dump completed。

但特别需要注意的是,此时间戳的由来在mysqldump 10.11版本(mysql5.0.x版本对应MySQL dump 10.11, 含10.11版本)记录的是UTC时区时间戳,而在mysqldump 10.12版本之后(mysql 5.5对应的版本是MySQL dump 10.13,含10.13)记录的是系统当前时区时间戳。

所以大家看到的是mysqldump 10.11备份结束的时间总是比系统当前时间提前8小时,例如mysql5.0系统当前是CST时区:2018-01-12  14:22:25  而备份文件结束时间戳是-- Dump completed on 2018-01-12  6:22:25。这个只是记录的时间戳不同,不影响最终的数据记录时间。

源码片段如下:

./client/mysqldump.c

#define DUMP_VERSION "10.13"

static void write_footer(FILE *sql_file)

{if(opt_xml)

{

fputs("\n", sql_file);

check_io(sql_file);

}else if (!opt_compact)

{if(opt_tz_utc)

fprintf(sql_file,"/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;\n");

fprintf(sql_file,"\n/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;\n");if (!path)

{

fprintf(md_result_file,"\

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS*/;\n\/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS*/;\n");

}if(opt_set_charset)

fprintf(sql_file,"/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n"

"/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\n"

"/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\n");

fprintf(sql_file,"/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;\n");

fputs("\n", sql_file);if(opt_dump_date)

{char time_str[20];

get_date(time_str, GETDATE_DATE_TIME,0);

print_comment(sql_file, 0, "-- Dump completed on %s\n", time_str);

}elseprint_comment(sql_file,0, "-- Dump completed\n");

check_io(sql_file);

}

}/*write_footer*/

0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql express 无法启动服务_在Windows2012下安装SQL Server 2005无法启动服务的解决办法...

因为安装了Windows2012操作系统,的确很不错,唯一的遗憾就是不支持Sql Server 2005的安装。找了很多办法,基本上都有缺陷。现在终于找到一种完全正常没有缺陷的办法了,和大家分享一下。1、正常安装任一版本的SQL Server 2005.2、安…

ecs php mysql集成环境_在阿里云 CentOS 服务器(ECS)上搭建 nginx + mysql + php-fpm 环境...

阿里云的云服务器(ECS)可以选择多种操作系统,打算用它运行 Drupal或者 WordPress ,你最好选择 Linux 系统,这篇文章的演示是基于阿里云的 CentOS 操作系统的服务器。我们在上面搭建一个 nginx mysql php-fpm 的环境,这就是常说的…

python处理文件夹_python文件及文件夹操作

1.open()各模式详情r 以只读模式打开,没有write()方法,默认打开方式w 以只写模式打开,文件不存在时会自动创建文件,文件已存在时会清除文件内容并重建文件。这种模式打开的文件没有read()方法。a 以追加模式打…

svn中项目管理中ec_Mac中使用svn进行项目管理

Mac中使用svn进行项目管理,借鉴了http://blog.csdn.net/q199109106q/article/details/8655204以下方案多人亲测可用转载请注明出处:http://blog.csdn.net/yc7369在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境。在Mac环境下,由于Mac自…

10067mysql_MYSQL数据库mysql Non-Transactional Database Only(只支持MyISAM)

《MYSQL数据库mysql Non-Transactional Database Only(只支持MyISAM)》要点:本文介绍了MYSQL数据库mysql Non-Transactional Database Only(只支持MyISAM),希望对您有用。如果有疑问,可以联系我们。MYSQL入门后来在做WordPress,一开始还不知道…

java类的定义的实例_《Java基础知识》Java类的定义及其实例化

类必须先定义才能使用。类是创建对象的模板,创建对象也叫类的实例化。下面通过一个简单的例子来理解Java中类的定义:public classDog {String name;intage;void bark()//汪汪叫{System.out.println("汪汪,不要过来");}voidhungry(){System.out.println(&q…

excel mysql插件_智分析Excel插件

智分析Excel插件官方版是一款好用的自助分析云平台,智分析Excel插件官方版是一款面向业务用户的EXCEL插件工具,智分析Excel插件官方版支持各类云端数据库、本地excel数据导入功能,软件能够将本地数据和线上数据结合起来分析。软件可以帮助办公…

【计算机网络】——习题解析:一个UDP用户数据的数据字段为8192字节,在数据链路层要使用以太网来传输,试问应当划分为几个IP数据报片?说明每一个IP数据报字段长度和片偏移字段的值

【计算机网络】——习题解析:一个UDP用户数据的数据字段为8192字节,在数据链路层要使用以太网来传输,试问应当划分为几个IP数据报片?说明每一个IP数据报字段长度和片偏移字段的值 答:6个数据字段的长度:前5…

网络协议,各层功能,各层协议

一、OSI七层模型 OSI七层协议模型主要是:应用层(Application)、表示层(Presentation)、会话层(Session)、传输层(Transport)、网络层(Network)、数…

fastdfs java token_fastdfs-client-java操作fastdfs

一、在https://github.com/happyfish100/fastdfs-client-java 下载客户端,解压后并执行ant命令,在E:\tools\libs\fastdfs\fastdfs-client-Java-master\src\build下会生成fastdfs_client.jar如图示二、mvn安装fastdfs_client.jar,在cmd中执行命…

idea编辑器中使用@Data注解无效解决办法

使用Data注解可以减少了以前的get和set等方法,但是在idea编辑器中不认识会在使用实体类元素时候找不到(但是运行不会报错) 所以可以添加插件

@Mapper和@Repository的区别

Mapper和Repository的区别 1.相同点 Mapper和Repository都是作用在dao层接口,使得其生成代理对象bean,交给spring 容器管理 对于mybatis来说,都可以不用写mapper.xml文件 2.不同点 Mapper不需要配置扫描地址,可以单独使用&#x…

git本地库(操作具体命令)

在任何盘符下创建本地仓库repository(除git目录下) 在项目目录创建新的本地仓库,并把项目里的所有文件全部添加、提交到本地仓库中去: $ git init #在当前的目录下创建一个新的空的本地仓库 Initialized empty Git repository…

idea右键项目没有git 【解决方法】

右键项目,没有git选项 解决方法: 进入settings,然后搜索version,按下图点击即可: over,解决:

用java设计秒表_运用Java编写 秒表程序

import java.awt.*;import java.awt.event.*;import javax.swing.*;public class SecondJFrame extends JFrame implements ActionListener,FocusListener{ //响应单击、焦点事件private JTextField text;private JB…

GIT commit问题 No errors and 30 warnings found. Would you like to review them?

GIT commit问题 No errors and 30 warnings found. Would you like to review them?

java spring 条件注解_【Spring】Spring高级话题-条件注解-@Condition

进行本示例的演示,需要先配置好Maven和Spring哦、见:【Spring】基于IntelliJ IDEA搭建Maven分析通过profile,我们可以获得不同的profile,我们可以获得不同的Bean。Spring4提供了一个更通用的基于条件的Bean的创建,即使用Condition…

解决springBoot 的templates中html引入css文件失败

我的情况是网页打开没有css效果 文件结构: 解决办法1:修改路径(springBoot已经默认静态资源在static文件夹)只需href“css/你的.css” 解决办法2:增加配置文件 解决办法3:使用 templates语法引入

java并发 cpu高_java高并发核心要点|系列5|CPU内存伪共享

上节提到的:伪共享,今天我们来说说。那什么是伪共享呢?这得从CPU的缓存结构说起。以下如图,CPU一般来说是有三级缓存,1 级,2级,3级,越上面的,越靠近CPU的,速度…

springboot拦截了静态资源css,js,jpg,png等

SpringBoot中自己写的拦截器,居然把静态资源也拦截了,导致了页面加载失败 /****/ Configuration public class SpringMvcWebConfigSupport implements WebMvcConfigurer {/*** 默认访问的是首页** param registry*/Overridepublic void addViewControlle…