天天看點

mysql --sqlmode引發的血案

mysql --sqlmode引發的血案

sql_mode :mysql中的一個系統環境變量,,定義了mysql應該支援的sql文法,資料校驗等;

mysql --sqlmode引發的血案

錯誤原因:

sqlmode中的ONLY_FULL_GROUP_BY的語義就是确定select target list中的所有列的值都是明确語義。

PS:在ONLY_FULL_GROUP_BY模式下,target list中的值要麼是來自于聚集函數的結果,要麼是來自于group by list中的表達式的值。

檢視目前資料mysql版本中sqlmode有哪些屬性:

SELECT @@global.sql_mode

修改sqlmode值:

SET @@global.sql_mode = “xx,xxx”

例如:

SET @@global.sql_mode = ‘ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’

sql_mode值的含義:

1.ONLY_FULL_GROUP_BY:對于GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現,那麼将認為這個SQL是不合法的,因為列不在GROUP BY從句中;

2.STRICT_TRANS_TABLES:在該模式下,如果一個值不能插入到一個事務表中,則中斷目前的操作,對非事務表不做任何限制;

3.NO_ZERO_IN_DATE:在嚴格模式,不接受月或日部分為0的日期。如果使用IGNORE選項,我們為類似的日期插入’0000-00-00’。在非嚴格模式,可以接受該日期,但會生成警告。

4.NO_ZERO_DATE:在嚴格模式,不要将 '0000-00-00’做為合法日期。你仍然可以用IGNORE選項插入零日期。在非嚴格模式,可以接受該日期,但會生成警告。

5.ERROR_FOR_DIVISION_BY_ZERO:在嚴格模式,在INSERT或UPDATE過程中,如果被零除(或MOD(X,0)),則産生錯誤(否則為警告)。如果未給出該模式,被零除時MySQL傳回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作結果為NULL。

6.NO_AUTO_CREATE_USER:防止GRANT自動建立新使用者,除非還指定了密碼。

7.NO_ENGINE_SUBSTITUTION:如果需要的存儲引擎被禁用或未編譯,那麼抛出錯誤。不設定此值時,用預設的存儲引擎替代,并抛出一個異常。

繼續閱讀