ONLY_FULL_GROUP_BY 對於GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現,那么這個SQL是不合法的,因為列不在GROUP BY從句中。 NO_AUTO_VALUE_ON_ZERO 該值影響自增長列的插入。默認情況下,在對自增主鍵插入NULL或0時,會自動生成下一個值。若開啟該MODE,當插入0時,並不會自動生成下一個值。 如果表中自增主鍵列存在0值,在進行邏輯備份還原時,可能會導致數據不一致。所以mysqldump在生成備份數據之前,會自動開啟該MODE,以避免數據不一致的情況。 STRICT_TRANS_TABLES 在該模式下,如果一個值不能插入到一個事物表中,則中斷當前的操作,對非事物表不做限制。 NO_ZERO_IN_DATE 同NO_ZERO_DATE類似,只不過NO_ZERO_DATE針對的是'0000-00-00',而NO_ZERO_IN_DATE針對的是年不為0,但月或者日為0的日期,如,'2010-00-01' or '2010-01-00'。 實際效果也是取決於是否開啟嚴格模式,同NO_ZERO_DATE一樣。 NO_ZERO_DATE 該MODE會影響'0000-00-00'的插入。實際效果還取決於是否開啟嚴格模式。 1. 在開啟嚴格模式,且同時開啟該MODE,是不允許'0000-00-00'插入的。 2. 只開啟嚴格模式,不開啟該MODE,允許'0000-00-00'值的插入,且不提示warning。 3. 不開啟嚴格模式,只開啟該MODE,允許'0000-00-00'值的插入,但提示warning。 4. 不開啟嚴格模式,也不開啟該MODE,允許'0000-00-00'值的插入,且不提示warning。 ERROR_FOR_DIVISION_BY_ZERO 在INSERT或UPDATE過程中,如果數據被零除,則產生錯誤而非警告。如果未給出該模式,那么數據被零除時MySQL返回NULL。 NO_AUTO_CREATE_USER MODE禁止的只是不帶“identified by”子句的grant語句,對於帶有“identified by”子句的grant語句,其並不會禁止。 NO_ENGINE_SUBSTITUTION 在開啟該MODE的情況下,在創建表時,如果指定的存儲引擎不存在或不支持,則會直接提示“ERROR”。 若不開啟,則只會提示“Warning”,且使用默認的存儲引擎。 PIPES_AS_CONCAT 將"||"視為字符串的連接操作符而非或運算符,這和Oracle數據庫是一樣的,也和字符串的拼接函數Concat相類似。 ANSI_QUOTES 啟用ANSI_QUOTES后,不能用雙引號來引用字符串,因為它被解釋為識別符。 ANSI 寬松模式,對插入數據進行校驗,如果不符合定義類型或長度,對數據類型調整或截斷保存,報warning警告。 TRADITIONAL 嚴格模式,當向mysql數據庫插入數據時,進行數據的嚴格校驗,保證錯誤數據不能插入,報error錯誤。用於事物時,會進行事物的回滾。 STRICT_TRANS_TABLES 嚴格模式,進行數據的嚴格校驗,錯誤數據不能插入,報error錯誤。 ALLOW_INVALID_DATES 若開啟該MODE,對於month和day的檢測會相對寬松。其中,month只需在1~12之間,day只需在1~31之間,而不管其是否有效,如下面的'2004-02-31'。注意,該MODE只適用於DATE和DATETIME,不適用於TIMESTAMP。 IGNORE_SPACE 默認情況下,函數名和左括號(“(”)之間不允許存在空格。若開啟該MODE,則允許。 NO_BACKSLASH_ESCAPES 默認情況下,反斜杠“\”會作為轉義符,若開啟該MODE,則反斜杠“\”會作為一個普通字符,而不是轉義符。 NO_DIR_IN_CREATE 默認情況下,在創建表時,可以指定數據目錄(DATA DIRECTORY)和索引目錄(INDEX DIRECTORY),若開啟該MODE,則會忽略這兩個選項。在主從復制場景下,可在從庫上開啟該MODE。 NO_UNSIGNED_SUBTRACTION 兩個整數相減,如果其中一個數是無符號位,默認情況下,會產生一個無符號位的值,如果該值為負數,則會提示“ERROR”。 PAD_CHAR_TO_FULL_LENGTH 在對CHAR字段進行存儲時,在Compact格式下,會占用固定長度的字節。 如下面的c1列,定義為char(10),雖然'ab'只占用兩個字節,但在Compact格式下,會占用10個字節,不足部分以空格填充。 在查詢時,默認情況下,會剔除掉末尾的空格。若開啟該MODE,則不會剔除,每次都會返回固定長度的字符。 REAL_AS_FLOAT 在創建表時,數據類型可指定為real,默認情況下,其會轉化為double,若開啟該MODE,則會轉化為float。 STRICT_ALL_TABLES 對事務表開啟嚴格模式。 STRICT_TRANS_TABLES 對所有表開啟嚴格模式。 TIME_TRUNCATE_FRACTIONAL 在時間類型定義了小數秒的情況下,如果插入的位數大於指定的位數,默認情況下,會四舍五入,若開啟了該MODE,則會直接truncate掉。 MySQL各版本sql modes區別 5.5 The default SQL mode is empty (no modes set). 5.6 The default SQL mode is NO_ENGINE_SUBSTITUTION. 5.7 The default SQL mode in MySQL 5.7 includes these modes: ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and NO_ENGINE_SUBSTITUTION. These modes were added to the default SQL mode in MySQL 5.7: The ONLY_FULL_GROUP_BY and STRICT_TRANS_TABLES modes were added in MySQL 5.7.5. The NO_AUTO_CREATE_USER mode was added in MySQL 5.7.7. The ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, and NO_ZERO_IN_DATE modes were added in MySQL 5.7.8. 8.0 The default SQL mode in MySQL 8.0 includes these modes: ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, and NO_ENGINE_SUBSTITUTION.