當5.6升級到5.7時,首先要注意的就是sql_mode對業務的影響 大概可以分為幾類
1 共同支持,如果你的5.6和5.7sql_mode配置支持的交集一樣,那么不用考慮
2 5.7細說
1 ONLY_FULL_GROUP_BY 該選項的含義表示:對於使用 GROUP BY 進行查詢的SQL,不允許 SELECT 部分出現 GROUP BY 中未出現的字段,也就是 SELECT 查詢的字段必須是 GROUP BY中出現的或者使用聚合函數的或者是具有唯一屬性的。
eg select a b c from d group a
解決方案 1 b c添加唯一索引,保住唯一性 2 sql_mode去掉此限制 3改寫sql
2 NO_ZERO_DATE & NO_ZERO_IN_DATE & time_zone MySQL中插入的時間字段值,不允許日期為零
eg Y_DATETIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
3 NO_ENGINE_SUBSTITUTION 在使用CREATE TABLE或者ALTER TABLE語法執行存儲引擎的時候,如果設定的存儲引擎被禁用或者未編譯,會產生錯誤。
4 STRICT_TRANS_TABLES 該選項針對事務性存儲引擎生效,對於非事務性存儲引擎無效,該選項表示開啟strict sql模式。在strict sql模式下,在INSERT或者UPDATE語句中,插入或者更新了某個不符合規定的字段值,則會直接報錯中斷操作
5 ERROR_FOR_DIVISION_BY_ZERO
INSERT或者UPDATE語句中,如果數據被0除,則出現警告(非strict sql模式下)或者錯誤(strict sql模式下)。
當該選項關閉時,數字被0除,得到NULL且不會產生警告
當該選項開啟且處於非strict sql模式下,數字被0除,得到NULL但是會產生警告
當該選項開啟且處於strict sql模式下,數字被0除,產生錯誤且中斷操作
6 NO_AUTO_CREATE_USER 之前版本中使用GRANT語法,如果用戶不存在則會自動創建用戶,該選項限制該功能
3 總結
1 當升級過程中,配置相同sql_mode的配置尤為重要,如果支持非常好,如果有問題,則進行改造
2 線上常用的都是3,4兩種.5.6-5.7通用
4 本文主要內容來源於愛可生技術文章