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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM