一:SQL_MODE的做用mysql
SQL_MODE是個很容易被忽視的變量,默認值是空值,在這種設置下是能夠容許一些非法操做的,好比容許一些非法數據的插入。在生產環境必須將這個值設置爲嚴格模式,因此開發、測試環境的數據庫也必需要設置,這樣在開發測試階段就能夠發現問題 sql
二:SQL_MODE的模式數據庫
ANSI模式:寬鬆模式,對插入數據進行校驗,若是不符合定義類型或長度,對數據類型調整或截斷保存,報warning警告。 bash
TRADITIONAL模式:嚴格模式,當向mysql數據庫插入數據時,進行數據的嚴格校驗,保證錯誤數據不能插入,報error錯誤。用於事物時,會進行事物的回滾。 oracle
STRICT_TRANS_TABLES模式:嚴格模式,進行數據的嚴格校驗,錯誤數據不能插入,報error錯誤。 ide
ANSI REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI
TRADITIONAL STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
三:有效值函數
四:有效值說明測試
REAL_AS_FLOAT:將real視爲float的同義詞而不是double的同義詞spa
PIPES_AS_CONCAT:將「||」視爲字符串的聯接操做符而非運算符,這個和oracle數據庫是同樣的,也和字符串的拼接函數concat相相似orm
ANSI_QUOTES:啓用ANSI_QUOTES後,不能使用雙引號來引用字符串,由於它將被解釋爲識別符
IGNORE_SPACE: 忽略函數名和括號之間的空格
STRICT_TRANS_TABLES:只對支持事務的表啓用嚴格模式
STRICT_ALL_TABLES:對全部引擎的表都啓用嚴格模式
NO_ZERO_DATE: 在非嚴格模式下,能夠插入形如「00-00-0000:00:00」的非法日期,mysql僅拋出一個警告,而啓用該選項後,mysql不容許插入零日期,插入0日期會拋出錯誤而非警告
NO_ZERO_IN_DATE:在嚴格模式下,不容許日期和月份爲零:採用日期和月份爲零的格式時mysql會直接拋出錯誤而非警告
ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE過程當中,若是數據被零除,則產生錯誤而非警告。如 果未給出該模式,那麼數據被零除時MySQL返回NULL
NO_AUTO_CREATE_USER:禁止GRANT建立密碼爲空的用戶
NO_ENGINE_SUBSTITUTION:若是須要的存儲引擎被禁用或未編譯,那麼拋出錯誤。不設置此值時,用默認的存儲引擎替代,並拋出一個異常
ONLY_FULL_GROUP_BY:對於GROUP BY聚合操做,若是在SELECT中的列,沒有在GROUP BY中出現,那麼這個SQL是不合法的,由於列不在GROUP BY從句中
NO_AUTO_VALUE_ON_ZERO:該值影響自增加列的插入。默認設置下,插入0或NULL表明生成下一個自增加值。若是用戶 但願插入的值爲0,而該列又是自增加的,那麼這個選項就有用了
ALLOWS_INVALID_DATES:該選項並不徹底對日期的合法性進行檢查,只檢查月份是否在1-12之間,日期是否在1-31之間。該模式僅對date和datetime類型有效,而對timestamp無效,由於timestamp老是要求一個合法的輸入
NO_BACKSLASH_ESCAPES:反斜槓「\」做爲普通字符而非轉義字符
NO_DIR_IN_CREATE:在建立表時忽視全部INDEXDIRETORY和DATA DIRECTORY的選項
NO_ENGINE_SUBSTITUTION:若是須要的存儲引擎被禁用或者未編譯,那麼拋出錯誤
NO_UNSIGNED_SUBSTITUTION:啓用這個選項後,兩個UNSIGNED類型相減返回SIGNED類型
五:合理設置
SET SQL_MODE='ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES';