sql_mode值的含義


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.

 


免責聲明!

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



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