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

最近在作一個項目的遷移工做,因爲開發環境所使用的都是最新的軟件版本(php7+mysql5.7)。遷移時不免會遇到一些兼容性的「坑」,好比將oracle中的數據遷移到mysql中的時間問題:php

設計到相似這樣的表結構: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的配置文件。sql

首先,查看當前的mysql中的 sql_mode變量的值:shell

#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

更改配置文件,去掉這兩個值便可。
php7

vim /etc/my.cnf

增長一行:oracle

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

其餘的則根據場景和業務自行更改。
ui


參考:spa

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

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

相關文章
相關標籤/搜索