通常遇到升到5.7 ,又沒改default value,會碰到2個問題
- datetime default value 是 0000–00–00 00:00:00 不給建table
- group by 在 select 中,必需明確定義(不能是只是‘*’)
都不難解,但取決於是開發階段還是升級,開發階段就改code 符合mysql 吧, 嚴謹總是比較好!
至於升級… 訂定目標吧
無奈解法:改回5.6 的預設值(記得也要修改mysql.cnf):
1 2 3 4 5 6 7 8 9 10 11 |
快速查詢 Select @@sql_mode; 動態設定 SET GLOBAL sql_mode=’NO_ENGINE_SUBSTITUTION’; my.cnf sql_mode=NO_ENGINE_SUBSTITUTION |
Mysql 5.7 預設 sql mode 說明
ONLY_FULL_GROUP_BY
在嚴格模式下,不要讓GROUP BY部分中的查詢指向未選擇的列,否則報錯。
NO_ZERO_DATE
在嚴格模式,不要將’0000–00–00’做為合法日期。你仍然可以用IGNORE選項插入零日期。在非嚴格模式,可以接受該日期,但會生成警告。
NO_ZERO_IN_DATE
在嚴格模式,不接受月或日部分為0的日期,對年不限制。如果使用IGNORE選項,我們為類似的日期插入’0000–00–00’。在非嚴格模式,可以接受該日期,但會生成警告。
ERROR_FOR_DIVISION_BY_ZERO
在嚴格模式,在INSERT或UPDATE過程中,如果被零除(或MOD(X,0)),則產生錯誤(否則為警告)。如果未給出該模式,被零除時MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作結果為NULL。
NO_AUTO_CREATE_USER
在嚴格模式下,防止GRANT自動建立新使用者,除非還指定了密碼。
NO_ENGINE_SUBSTITUTION
如果需要的儲存引擎被禁用或未編譯,可以防止自動替換儲存引擎。
STRICT_TRANS_TABLES
為事務儲存引擎啟用嚴格模式,也可能為非事務儲存引擎啟用嚴格模式,非法資料值被拒絕,下面有詳細說明。
嚴格模式控制MySQL如何處理非法或丟失的輸入值。有幾種原因可以使一個值為非法。例如,資料型別錯誤,不適合列,或超出範圍。當新插入的行不包含某列的沒有顯示定義DEFAULT子句的值,則該值被丟失。
對於事務表,當啟用STRICT_ALL_TABLES或STRICT_TRANS_TABLES模式時,如果語句中有非法或丟失值,則會出現錯誤。語句被放棄並滾動。
對於非事務表,如果插入或更新的第1行出現壞值,兩種模式的行為相同。語句被放棄,表保持不變。如果語句插入或修改多行,並且壞值出現在第2或後面的行,結果取決於啟用了哪個嚴格選項:
對於STRICT_ALL_TABLES,MySQL返回錯誤並忽視剩餘的行。但是,在這種情況下,前面的行已經被插入或更新。這說明你可以部分更新,這可能不是你想要的。要避免這點,最好使用單行語句,因為這樣可以不更改表即可以放棄。
對於STRICT_TRANS_TABLES,MySQL將非法值轉換為最接近該列的合法值並插入調整後的值。如果值丟失,MySQL在列中插入隱式 預設值。在任何情況下,MySQL都會生成警告而不是給出錯誤並繼續執行語句。
嚴格模式不允許非法日期,例如’2004–04–31’。它不允許禁止日期使用“零”部分,例如’2004–04–00’或”零”日期。要想禁止,應在嚴格模式基礎上,啟用NO_ZERO_IN_DATE和NO_ZERO_DATE SQL模式。
如果你不使用嚴格模式(即不啟用STRICT_TRANS_TABLES或STRICT_ALL_TABLES模式),對於非法或丟失的值,MySQL將插入調整後的值並給出警告。在嚴格模式,你可以通過INSERT IGNORE或UPDATE IGNORE來實現。