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 ...
随机推荐
- Android : 网络adb配置及有线端口占用解决方法
一.调试环境: Android Debug Bridge version 1.0.40: Nexus6P平板(Android 8.0系统): 二.网络ADB调试: 1. Android设备除了用有线u ...
- 文件上传FormData
<div class="modal-dialog"> <div class="modal-content"> <div class ...
- Python实现登陆的功能
import datetimetoday=datetime.datetime.today()# 获取当前时间for i in range(3): username=input("请输入用户名 ...
- 多点触控 TouchAction
#TouchAction #TouchAction方法是appium自已定义的新方法 # * 短按 (press) * 释放 (release) * 移动到 (moveTo) * 点击 (tap) * ...
- pytest启动浏览器,失败用例截图
1.conftest.py # coding:utf- from selenium import webdriver import pytest driver = None @pytest.mark. ...
- Python 基础list 增删改查 解析
一 增加 1 append 增加到最后一个列表 li = [ 1,3,4 ,'wang',]li.append('wangyan')print(li)[1, 3, 4, 'wang' ...
- mysql数据库负载均衡
负载均衡集群是有一组相互独立的计算机系统构成,通过常规网络或专用网络进行链接,有路由器衔接在一起,各个节点相互协作,共同负载.均衡压力,对客户端来说,整个群集可以视为一台具有超高性能的独立服务器. 实 ...
- 【webdriver自动化】整理API框架(主要是关键字,具体例子在本地)
1. 获取网页源码 pageSource = self.driver.page_source print pageSource.encode("gbk","ignore& ...
- c语言求最大公约数和最小公倍数(转)
最大公约数与最小公倍数的求解是很多初学C的人所面临的一道问题.当然这道问题并不难解答,也有很多人已经写过相关的博客,我在此书写此篇博客,一是为了让自己能够夯实基础,另外就是希望能够帮到和我一样的初学者 ...
- 【Java】将字节转换成十六进制、BCD码输出
public class HexUtils { public static void main(String[] args) { byte []out = { 0, 1, 2, 3, 4, 5, 6, ...