MySQL从5.5升级到5.6,TIMESTAMP的变化

前言

前段时间,系统MySQL从5.5升级到了5.6,系统出现了大量的异常。大部分异常引起原因是由于TIMESTAMP的行为发生了变化。

TIMESTAMP在MySQL5.5中的行为

  • 第一个未设置默认值的TIMESTAMP NOT NULL字段隐式默认值:

    CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

  • 后面未设置默认值的TIMESTAMP NOT NULL字段隐式默认值:

    0000-00-00 00:00:00

  • TIMESTAMP NOT NULL字段插入NULL时,会使用隐式默认值:

    CURRENT_TIMESTAMP

  • 不支持多个CURRENT_TIMESTAMP 默认值

TIMESTAMP在MySQL5.6中的行为

  • 支持多个CURRENT_TIMESTAMP 默认值
  • 可以兼容5.5的行为,支持隐性默认值
    • explicit_defaults_for_timestamp=0
    • 我测试安装的MySQL5.6默认使用这个参数,启动时,服务器会给出一个警告。

      [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use –explicit_defaults_for_timestamp server option (see documentation for more details).

  • 可以去掉隐性默认值
    • explicit_defaults_for_timestamp=1

总结

  • MySQL5.5中TIMESTAMP行为是比较诡异的,会造成一些隐含的问题,比如程序中传入了NULL值
  • MySQL5.6中可以将TIMESTAMP的行为变得正常,但会存在兼容问题
  • explicit_defaults_for_timestamp参数未来会消失
  • 我们不要过度依赖数据库的特性,这些特性会给应用程序造成掣肘


参考:http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_explicit_defaults_for_timestamp

本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/45625841,转载请注明。

时间: 2024-11-04 23:45:01

MySQL从5.5升级到5.6,TIMESTAMP的变化的相关文章

在CentOS上把MySQL从5.5升级到5.6(转)

http://www.th7.cn/db/mysql/201408/66064.shtml 在CentOS上把MySQL从5.5升级到5.6 摘要:本文记录了在CentOS 6.3上,把MySQL从5.5.28升级到5.6.19的过程. 1. 概述 在我做的一个项目中,最近我对生产服务器上的一系列系统软件进行了升级,包括git.nginx.MySQL和PHP.这篇文章讲的是升级MySQL的过程,其他软件的升级将在其他文章中介绍. 在我加入这个项目之前,网络服务器MySQL已经安装设置好了,我只是

Ubuntu 12.04.1 mysql从5.5升级到5.6

方法一 直接升级 apt-cache search mysql-server sudo  apt-add-repository ppa:ondrej/mysql-5.6 sudo apt-get update apt-cache search mysql-server apt-get -y install mysql-server 方法二 先卸载然后安装 apt-get -y remove mysql-server apt-get -y autoremove apt-get -y install

MySQL/MariaDB/Percona数据库升级脚本

MySQL/MariaDB/Percona数据库升级脚本截取<OneinStack>中upgrade_db.sh, 一般情况下不建议升级数据库版本,该脚本专提供给各位版本控们.为防止大版本之间兼容问题,脚本默认仅支持同一大版本之间的升级,如:MySQL- 5.6.25升级到MySQL-5.6.26.MySQL-5.5.44升级到MySQL-5.5.45.MariaDB-10.0.20升级到 MariaDB-10.0.21:不能跨分支版本且不能跨大版本,如从MySQL-5.5.44升级到Perc

MYSQL 5.1.73升级到5.6.14

只读事务在MySQL5.6中引入,改进了创建视图快照的开销,减少了持有trx_sys->mutex的时间,这有利于提升只读性能:这一点已经广为人知. 鉴于我司版本极低,所以亟需升级,接下来把本次升级的步骤和填坑记录下来: 升级用的在线环境: Centos 6.5 MySql5.1.73 Seafile(为什么要提到他,在后面有提到他) 第一步:准备安装文件 wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-shared-5.6.14-

mysql从5.6升级到5.7后出现 Expression #1 of ORDER BY clause is not in SELECT list,this is incompatible with DISTINCT

[问题]mysql从5.6升级到5.7后出现:插入数据和修改数据时出错Caused by: com.ibatis.common.jdbc.exception.NestedSQLException: --- The error occurred while applying a parameter map. --- Check the findOrderList-InlineParameterMap. --- Check the statement (query failed). --- Caus

从Indy9升级到Indy10时IdTcpServer的变化

从Indy9升级到Indy10时IdTcpServer的变化 首先Indy9.18中的TcpServer在Indy10中被分割成了2个组件:TIdCmdTCPServer和TIdTCPServer.其中TIdCmdTCPServer是原来的TIdTCPServer,新的TIdTCPServer单独分出来了.             再者所以的原始的reads和writes包括Read, ReadLn, Write, WriteLn等现在变成IOHandler的属性而不是TCPConnection

mysql二进制安装,升级,多实例部署

目标 理解线上部署考虑的因素 学会编译安装以及二进制安装mysql 学会升级mysql 学会多实例部署mysql数据库 学会合理部署mysql线上库 考虑因素: 版本选择,5.1,5.5还是5.6? 分支选择,官方社区版?percona server?mariadb? 推荐官方版,简单易上手 安装方式,包安装?二进制包安装?源码安装? 线上推荐二进制包安装 路径配置,参数配置(尽量模板化,标准化) 一个实例多个库,or多个实例单个库? 二进制安装mysql 下载软件安装包 解压放到指定目录(比如

MySQL 5.6升级至MySQL 5.7--------版本升级最佳实战

1. 背景 MySQL 5.7是当前MySQL最新版本,与MySQL 5.6版本相比,有如下特征 * 性能和可扩展性:改进 InnoDB 的可扩展性和临时表的性能,从而实现更快的网络和大数据加载等操作. * JSON支持:使用 MySQL 的 JSON 功能,你可以结合 NoSQL 的灵活和关系数据库的强大. * 改进复制 以提高可用性的性能.包括多源复制,多从线程增强,在线 GTIDs,和增强的半同步复制. * 性能模式 提供更好的视角.我们增加了许多新的监控功能,以减少空间和过载,使用新的

MySQL从5.5升级到5.6

由于遇到用MySQL建表时,两个timestamp类型的字段无法同时使用current_stamp,查了资料发现是mysql低版本不支持这个功能,那么就升级版本吧. 先把旧版本删除,参考URL:http://jingyan.baidu.com/article/1e5468f921400f484961b7d1.html 方法/步骤 1 控制面板里的增加删除程序内进行删除 2 删除MySQL文件夹下的my.ini文件,如果备份好,可以直接将文件夹全部删除 3 开始->运行-> regedit 看看