MySQL--时间戳属性2
在MySQL 5.6版本中引入参数explicit_defaults_for_timestamp设置,该参数会影响Timestamp的默认属性。
同时在MySQL 5.6版本中中,去除一张表只能有一个TIMESTAMP列的限制,允许单表中使用多个时间戳列。
===============================================================================
在MySQL 5.6中,当参数explicit_defaults_for_timestamp=OFF时:
1、TIMESTAMP列如果没有明确指定为NLL,则默认为NOT NULL
2、TIMESTAMP列如果明确指定为NULL,则会增加默认值NULL
3、表中第一个TIMESTAMP列,如果没有声明为NULL属性、DEFAULT或者 ON UPDATE,会自动分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 属性。
4、表中第二个TIMESTAMP列,如果没有声明为NULL或者DEFAULT子句,默认自动分配’0000-00-00 00:00:00′。插入行时没有指明改列的值,该列默认分配’0000-00-00 00:00:00′,且没有警告。
如使用下面脚本创建:
CREATE TABLE tb2004(
id INT PRIMARY KEY,
c1 TIMESTAMP,
c2 TIMESTAMP,
c3 TIMESTAMP);
然后SHOW CREATE TABLE tb2004会发现创建脚本为:
CREATE TABLE `tb2004` (
`id` int(11) NOT NULL,
`c1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`c2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`c3` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
===============================================================================
在MySQL 5.6中,当参数explicit_defaults_for_timestamp=ON时:
1、TIMESTAMP列如果没有明确指定为NOT NLL则默认为NULL
2、表中TIMESTAMP列声明为NOT NULL时,则不会为列自动创建默认值,且该列不能显式插入NULL值。
3、表中第一个TIMESTAMP列不会自动分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 属性,需要显式声明。
4、表中第二各TIMESTAMP列与第一个TIMESTAMP列不会存在特殊设置。
如使用下面脚本创建:
CREATE TABLE tb2004(
id INT PRIMARY KEY,
c1 TIMESTAMP,
c2 TIMESTAMP,
c3 TIMESTAMP);
然后SHOW CREATE TABLE tb2004会发现创建脚本为:
CREATE TABLE `tb2004` (
`id` int(11) NOT NULL,
`c1` timestamp NULL DEFAULT NULL,
`c2` timestamp NULL DEFAULT NULL,
`c3` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 而如使用下面脚本创建:
CREATE TABLE tb2005(
id INT PRIMARY KEY,
c1 TIMESTAMP NOT NULL,
c2 TIMESTAMP NOT NULL,
c3 TIMESTAMP NOT NULL);
然后SHOW CREATE TABLE tb2005会发现创建脚本为:
CREATE TABLE `tb2005` (
`id` int(11) NOT NULL,
`c1` timestamp NOT NULL,
`c2` timestamp NOT NULL,
`c3` timestamp NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
=================================================================
在MySQL5.7.8及之后版本中,参数sql_mode的默认值为:
ONLY_FULL_GROUP_BY
STRICT_TRANS_TABLES
NO_ZERO_IN_DATE
NO_ZERO_DATE
ERROR_FOR_DIVISION_BY_ZERO
NO_AUTO_CREATE_USER
NO_ENGINE_SUBSTITUTION
其中NO_ZERO_IN_DATE和NO_ZERO_DATE会严格限制时间字段和时间戳字段的值:
NO_ZERO_IN_DATE:要求年月日都为0或月日不为0
NO_ZERO_DATE:要求年月日中任一项不为0

当sql_mode中同时包含NO_ZERO_IN_DATE和NO_ZERO_DATE时,则不允许向时间字段和时间戳字段插入任何非法日期的值,即不允许插入'0000-00-00 00:00:00'的值。
=================================================================
总结和建议:
1、为避免受参数explicit_defaults_for_timestamp的影响,在建表时建议写全timestamp的所有属性。
2、时间戳字段主要用于记录行被插入或更新的时间,应避免向时间戳列显示插入NULL值或异常时间值。
=================================================================
MySQL--时间戳属性2的更多相关文章
- FROM_UNIXTIME 格式化MYSQL时间戳函数
FROM_UNIXTIME 格式化MYSQL时间戳函数 对MYSQL没有进行过深入的研究,基础知识匮乏,一遇到问题只能手册,看来要把MYSQL的学习安排进时间表了. 函数:FROM_UNIXTIME作 ...
- MySQL时间戳和时间格式转换函数
MySQL时间戳和时间格式转换函数:unix_timestamp and from_unixtime unix_timestamp将时间转化成时间戳格式.from_unixtime将时间戳转化成时间格 ...
- MySQL 时间戳(Timestamp)函数
1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp() mysql> select current_timestamp, curren ...
- MySQL字段属性NUll的注意点
MySQL字段属性应该尽量设置为NOT NULL 除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL.这看起来好像有点争议,请往下看. 空值("&quo ...
- MySQL 时间戳(Timestamp)函数
1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp() mysql> select current_timestamp, curren ...
- mysql数据库优化课程---4、mysql字段属性
mysql数据库优化课程---4.mysql字段属性 一.总结 一句话总结: mysql字段:没有被淘汰的必然有其存在的合理性(也就是有优点),比如char类型 1.为什么char类型没有被淘汰? c ...
- MySQL 时间戳与日期互相转换
MySQL 时间戳与日期互相转换 1.时间戳转换成日期 函数:FROM_UNIXTIME() ,'%Y年%m月%d日') 结果为:2015年04月15日 2.把日期转换为时间戳,和 FROM_UNIX ...
- 一起MySQL时间戳精度引发的血案
写在前面 最近工作中遇到两例mysql时间戳相关的问题,一个是mysql-connector-java和msyql的精度不一致导致数据查不到:另一例是应用服务器时区错误导致数据查询不到.通过这篇文章, ...
- MYSQL时间戳和日期相互转换 笔记整理
相关函数: date_format(date, format) 函数,MySQL日期格式化函数date_format() unix_timestamp() 函数 str_to_date(str, fo ...
- Mysql时间戳转Java时间戳
MySQL 时间戳和Java返回的时间戳是不一样的 例如: 当前时间是 2014-08-04 10:42:55.204000 使用mysql时间戳函数UNIX_TIMESTAMP 返回的结果为: 14 ...
随机推荐
- Windows系统上设置 Git Bash 的 Font 及 Locale
在windows 上使用 Git Bash 可以获得 unix 命令 操作体验. 但是初始的Git Bash的字体及语系都很不方便,需要自己设置. 在Git Bash的命令窗体上边框点击鼠标右键可以进 ...
- 第一章 使用功能测试协助安装Django
1.1 第一个简单的测试--断言 from selenium import webdriver browser = webdriver.Firefox() browser.get('http://lo ...
- python笔记4-if..elif-else条件语句
python中条件判断使用if else来判断,多分支的话使用if elif ... else,也就是如果怎么怎么样就怎么怎么样,否则就怎么怎么这样,格式如下: #if是布尔类型判断,1个是真1个是假 ...
- Codeforces Round #496 (Div. 3 ) E1. Median on Segments (Permutations Edition)(中位数计数)
E1. Median on Segments (Permutations Edition) time limit per test 3 seconds memory limit per test 25 ...
- 如何用UltraEdit查看并修改Oracle导出的dump文件的字符集
如何查询dmp文件的字符集 用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集.如果dmp文件不大,比如只有几M或几十M,可以用Ultr ...
- 【MySQL】5.6.x InnoDB Error Table mysql.innodb_table_stats not found
[问题描述]: 检查error log的时候发现大量warnings: [Warning] InnoDB Error Table mysql.innodb_index_stats not found ...
- JS之计时器
JavaScript 计时事件 通过使用 JavaScript,我们有能力作到在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行.我们称之为计时事件. 在 JavaScritp 中使用计 ...
- spark-streaming first insight
一. Spark Streaming 构建在Spark core API之上,具备可伸缩,高吞吐,可容错的流处理模块. 1)支持多种数据源,如Kafka,Flume,Socket,文件等: Basic ...
- LINUX7安装Oracle11g单实例小结
LINUX7安装Oracle11g遇到问题如下,记录 添加组: groupadd -g 1000 oinstall #报错:提示组被占用 #useradd: group 'oinstall' does ...
- Python之路,第十三篇:Python入门与基础13
python3 模块 模块 Module 概念: 模块是一个保护有一系统变量.函数.类等组成的程序组: 模块是一个文件,模块文件名通常以.py 结尾: 作用:让一些相关的变量,函数, 类等有逻辑的 ...