最近在作一個項目的遷移工做,因爲開發環境所使用的都是最新的軟件版本(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