1. 程式人生 > >mysql5.7 版本中 timestamp 不能為零日期 以及sql_mode合理設定

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

---恢復內容開始---

摘要: mysql5.7版本相比較之前的版本有很多的特性的增加以及預設配置的改變,在使用中難免會遇到與之前的使用習慣或者專案需求不符的情況。就需要調整相應的變數的值,比如sql_mode的值

最近在做一個專案的遷移工作,由於開發環境所使用的都是最新的軟體版本(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;
複製程式碼

 

1 <code class= "hljs sql" ><span class= "hljs-keyword" ><span class= "hljs-keyword" > </span></span></code>

其中的 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)
複製程式碼

 

1 <code class= "hljs lua" > </code>

預設會有:NO_ZERO_IN_DATE 和 NO_ZERO_DATE 兩個值,限制欄位不能為零日期

更改配置檔案,去掉這兩個值即可。

vim /etc/my.cnf

 

1 <code class= "hljs nginx" ><span class= "hljs-attribute" ><span class= "hljs-attribute" > < /span >< /span >< /code >

增加一行:

 

sql_mode=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

 

1 <code class= "hljs ini" ><span class= "hljs-attr" ><span class= "hljs-attr" > </span></span></code>

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

 

轉:

https://my.oschina.net/u/192792/blog/652627