sql_mode是個很容易被忽視的變量,默認值是空值,在這種設置下(xià)是可以允許一(yī)些非法操作的,比如允許一(yī)些非法數據的插入。在生(shēng)産環境必須将這個值設置爲嚴格模式,所以開(kāi)發、測試環境的數據庫也必須要設置,這樣在開(kāi)發測試階段就可以發現問題
sql_mode常用值如下(xià):
ONLY_FULL_GROUP_BY:
對于GROUP BY聚合操作,如果在SELECT中(zhōng)的列,沒有在GROUP BY中(zhōng)出現,那麽這個SQL是不合法的,因爲列不在GROUP BY從句中(zhōng)
NO_AUTO_VALUE_ON_ZERO:
該值影響自增長列的插入。默認設置下(xià),插入0或NULL代表生(shēng)成下(xià)一(yī)個自增長值。如果用戶 希望插入的值爲0,而該列又(yòu)是自增長的,那麽這個選項就有用了。
STRICT_TRANS_TABLES:
在該模式下(xià),如果一(yī)個值不能插入到一(yī)個事務表中(zhōng),則中(zhōng)斷當前的操作,對非事務表不做限制
NO_ZERO_IN_DATE:
在嚴格模式下(xià),不允許日期和月份爲零
NO_ZERO_DATE:
設置該值,mysql數據庫不允許插入零日期,插入零日期會抛出錯誤而不是警告。
ERROR_FOR_DIVISION_BY_ZERO:
在INSERT或UPDATE過程中(zhōng),如果數據被零除,則産生(shēng)錯誤而非警告。如 果未給出該模式,那麽數據被零除時MySQL返回NULL
NO_AUTO_CREATE_USER:
禁止GRANT創建密碼爲空的用戶
NO_ENGINE_SUBSTITUTION:
如果需要的存儲引擎被禁用或未編譯,那麽抛出錯誤。不設置此值時,用默認的存儲引擎替代,并抛出一(yī)個異常
PIPES_AS_CONCAT:
将"||"視爲字符串的連接操作符而非或運算符,這和Oracle數據庫是一(yī)樣的,也和字符串的拼接函數Concat相類似
ANSI_QUOTES:
啓用ANSI_QUOTES後,不能用雙引号來引用字符串,因爲它被解釋爲識别符
ORACLE的sql_mode設置等同:PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.
如果使用mysql,爲了繼續保留大(dà)家使用oracle的習慣,可以對mysql的sql_mode設置如下(xià):
在my.cnf添加如下(xià)配置
[mysqld]
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'