文档章节

mysql5.7 版本中 timestamp 不能为零日期 以及sql_mode合理设置

观光者
 观光者
发布于 2016/04/05 12:28
字数 435
阅读 1342
收藏 0

最近在做一个项目的迁移工作,由于开发环境所使用的都是最新的软件版本(php7+mysql5.7)。迁移时难免会遇到一些兼容性的“坑”,比如将oracle中的数据迁移到mysql中的时间问题:

设计到类似这样的表结构:

CREATE TABLE `cm_admin_user_group` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL DEFAULT '0' COMMENT 'User ID',
  `group_id` int(11) NOT NULL DEFAULT '0' COMMENT 'Group ID',
  `is_leader` int(1) NOT NULL DEFAULT '0' COMMENT '是否组长;0:不是,1:是',
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '加入时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uidx` (`user_id`,`group_id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

其中的 updated_at 和 created_at 的类型是 timestamp  并且会默认零日期(业务设计需求),但是在mysql5.7的版本中,默认是不允许设置为零日期的。为此,需要更改mysql的配置文件。

首先,查看当前的mysql中的 sql_mode变量的值:

#select @@sql_mode;

mysql> select @@sql_mode;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                                                                     |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| PIPES_AS_CONCAT,ANSI_QUOTES,ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

默认会有:NO_ZERO_IN_DATE 和 NO_ZERO_DATE 两个值,限制字段不能为零日期

更改配置文件,去掉这两个值即可。

vim /etc/my.cnf

增加一行:

sql_mode=ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES

其他的则根据场景和业务自行更改。


参考:

http://dba.stackexchange.com/questions/112633/invalid-default-value-mysql-5-7-for-timestamp-field

http://blog.csdn.net/wyzxg/article/details/8787878


© 著作权归作者所有

观光者
粉丝 4
博文 5
码字总数 4278
作品 0
郑州
程序员
私信 提问
Mysql 数据库日期 存储精度问题

一、mysql 数据库日期类型 名称 描述 字节数 格式 取值范围 零值 year 表示时间 1 yyyy 1901-2155 0000 date 表示日期 4 yyyy-mm-dd 1000-01-01~9999-12-31 0000-00-00 time 表示一天中的时间...

坎布里奇
09/11
0
0
MySQL 5.7默认ONLY_FULL_GROUP_BY语义介绍以及故障解决

版权声明:本文为EnweiTech原创文章,未经博主允许不得转载。 https://blog.csdn.net/English0523/article/details/87633695 问题描述:Thinkphp程序由mysql5.6版本升级为mysql5.7版本,出现...

天府云创
02/18
0
0
mysql5.7 sql_model 问题:ONLY_FULL_GROUP_BY

一、MySQL的sql_mode ONLYFULLGROUP_BY:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中 NOAUTOVALUEONZERO:该值影响...

imentors
2016/07/03
0
0
MySQL5.5 SQL_MODE

一:SQLMODE的作用 SQLMODE是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,所以开发、...

C_凡夫俗子
2018/06/26
0
0
ERROR 1067 (42000): Invalid default value for 'end_time'

版本:mysql5.7 执行sql: CREATE TABLE seckill( BIGINT NOT NUll AUTO_INCREMENT COMMENT '商品库存ID', VARCHAR(120) NOT NULL COMMENT '商品名称', int NOT NULL COMMENT '库存数量', TIME......

sun2shadows
2017/09/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

宜信微服务任务调度平台建设实践|分享实录

内容来源:宜信技术学院第4期技术沙龙-线上直播|宜信微服务任务调度平台建设实践 主讲人:宜信高级架构师 开发平台负责人 梁鑫 导读:如今,无论是互联网应用还是企业级应用,都充斥着大量的...

宜信技术学院
1分钟前
0
0
concat和concat_ws

select concat('大','小') as size from 表 查询出结果为:大小 select concat('大',NULL) as size from 表 查询出结果为:null concat中又一个参数为NULL,查出来的就为NULL select concat_......

郭周园
12分钟前
0
0
Java设计模式六大原则

一.单一职责原则   单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小。单一职责原则定义如下: 单一职责原则(Single Responsibility Principle, SRP):一个类只负责一个功...

asdf08442a
19分钟前
2
0
解读MySQL性能调优“金字塔”

计算机是一种实验的科学,性能优化是实战的艺术 蒸汽机的改进不是一蹴而就的,MySQL性能的改进也是贯穿整个MySQL发展史的。MySQL之父Monty在1981年写了MySQL的第一行代码以后,在开源的帮助下...

博文视点Bv
22分钟前
2
0
直播系统源码必备的几个功能

网络直播平台发展至今,除了在经营上涉及的行业越来越多之外,随着产品的升级,也演化出了多种多样表达形式,除了传统的一对多直播间,近些年不久盛行的一对一直播或是短视频 直播等。 APP手...

布谷科技
23分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部