MySQL的sql mode解析與設定

2021-09-28 11:53:05 字數 2217 閱讀 3615

昨晚在往mysql資料庫中插入一組資料時,出錯了!資料庫無情了給我報了個錯誤:error 1365(22012):division by 0;意思是說:你不可以往資料庫中插入乙個 除數為0的運算的結果。於是乎去谷歌了一番,總算是明白了其中的原因:是因為mysql的sql_mode 模式限制著一些所謂的『不合法』的操作。

解析這個sql_mode,簡而言之就是:它定義了你mysql應該支援的sql語法,對資料的校驗等等。。

一、如何檢視當前資料庫使用的sql_mode:

mysql> select @@sql_mode;
如下是我的資料庫當前的模式:

二、sql_mode值的含義:

only_full_group_by:

對於group by聚合操作,如果在select中的列,沒有在group by**現,那麼將認為這個sql是不合法的,因為列不在group by從句中

strict_trans_tables:

在該模式下,如果乙個值不能插入到乙個事務表中,則中斷當前的操作,對非事務表不做任何限制

no_zero_in_date:

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

no_zero_date:

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

error_for_division_by_zero:

在嚴格模式,在insert或update過程中,如果被零除(或mod(x,0)),則產生錯誤(否則為警告)。如果未給出該模式,被零除時mysql返回null。如果用到insert ignore或update ignore中,mysql生成被零除警告,但操作結果為null。

no_auto_create_user

防止grant自動建立新使用者,除非還指定了密碼。

no_engine_substitution:

如果需要的儲存引擎被禁用或未編譯,那麼丟擲錯誤。不設定此值時,用預設的儲存引擎替代,並丟擲乙個異常

另外還有一些,這裡僅對我本地當前值做解釋分析。。。。。

三、據說是mysql5.0以上版本支援三種sql_mode模式:ansi、traditional和strict_trans_tables。

1、ansi模式:寬鬆模式,更改語法和行為,使其更符合標準sql。對插入資料進行校驗,如果不符合定義型別或長度,對資料型別調整或截斷儲存,報warning警告。對於本文開頭中提到的錯誤,可以先把sql_mode設定為ansi模式,這樣便可以插入資料,而對於除數為0的結果的字段值,資料庫將會用null值代替。

將當前資料庫模式設定為ansi模式:

mysql> set @@sql_mode=ansi;
2、traditional模式:嚴格模式,當向mysql資料庫插入資料時,進行資料的嚴格校驗,保證錯誤資料不能插入,報error錯誤,而不僅僅是警告。用於事物時,會進行事物的回滾。 注釋:一旦發現錯誤立即放棄insert/update。如果你使用非事務儲存引擎,這種方式不是你想要的,因為出現錯誤前進行的資料更改不會「滾動」,結果是更新「只進行了一部分」。

將當前資料庫模式設定為traditional模式:

mysql> set @@sql_mode=traditional;
3、strict_trans_tables模式:嚴格模式,進行資料的嚴格校驗,錯誤資料不能插入,報error錯誤。如果不能將給定的值插入到事務表中,則放棄該語句。對於非事務表,如果值出現在單行語句或多行語句的第1行,則放棄該語句。

將當前資料庫模式設定為strict_trans_tables模式:

mysql> set @@sql_mode=strict_trans_tables;
沒有最好與最壞的模式,只有最合適的模式。需要根據自己的實際情況去選擇那個最適合的模式!!!

另外說一點,這裡的更改資料庫模式都是session級別的,一次性,關了再開就不算數了!!!

也可以通過配置檔案設定:vim /etc/my.cnf

在my.cnf(my.ini)新增如下配置:

[mysqld]

sql_mode=『你想要的模式』

MySQL的sql mode解析與設定

解析 這個sql mode,簡而言之就是 它定義了你mysql應該支援的sql語法,對資料的校驗等等。一 如何檢視當前資料庫使用的sql mode mysql select sql mode 如下是我的資料庫當前的模式 二 sql mode值的含義 only full group by 對於grou...

MySQL的sql mode解析與設定

sql mode 簡而言之就是 它定義了你mysql應該支援的sql語法,對資料的校驗等等 select sql mode 使用該命令我們可以檢視我們當前資料庫的sql mode view code 下面我們來看看sql mode的各個值的含義 only full group by 對於group ...

mysql的sql mode合理設定

mysql的sql mode合理設定 sql mode是個很容易被忽視的變數,預設值是空值,在這種設定下是可以允許一些非法操作的,比如允許一些非法資料的插入。在生產環境必須將這個值設定為嚴格模式,所以開發 測試環境的資料庫也必須要設定,這樣在開發測試階段就可以發現問題 sql mode常用值如下 o...