1. 程式人生 > >mysql5.7.X版本only_full_group_by問題解決

mysql5.7.X版本only_full_group_by問題解決

一、出錯原因

最近因為開發資料庫與部署資料庫版本不同,帶來了幾個問題,其中only_full_group_by問題是之前沒有遇到的。

     具體報錯如下

1 [Err] 1055 - Expression #1 of ORDER BY clause is not 
in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ'
which is not functionally dependent on columns in GROUP BY clause;
this
is incompatible with sql_mode=only_full_group_by

可以看出是因為sql_mode中設定了only_full_group_by模式引起的,

sql_mode的作用是什麼呢?

模式定義mysql會支援哪些sql語法。以及應執行哪種資料驗證檢查。最終達到的目標:適應在不同環境中適應mysql,因為可

以根據各自的程式設定不同的操作模式。

 

在only_full_group_by這種模式下,使用group by語句進行查詢時,所要查詢的語句必須依賴於group by子句中所列出的列,也就是group by要以查詢的欄位

作為分組依據,這裡是要查詢的所有欄位。

另外常用的sql_mode有:

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

NO_AUTO_VALUE_ON_ZERO: 
該值影響自增長列的插入。預設設定下,插入0或NULL代表生成下一個自增長值。如果使用者 希望插入的值為0,而該列又是自增長的,那麼這個選項就有用了。

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

NO_ZERO_IN_DATE: 
在嚴格模式下,不允許日期和月份為零

NO_ZERO_DATE: 
設定該值,mysql資料庫不允許插入零日期,插入零日期會丟擲錯誤而不是警告。

ERROR_FOR_DIVISION_BY_ZERO: 
在INSERT或UPDATE過程中,如果資料被零除,則產生錯誤而非警告。如 果未給出該模式,那麼資料被零除時MySQL返回NULL

NO_AUTO_CREATE_USER: 
禁止GRANT建立密碼為空的使用者

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

PIPES_AS_CONCAT: 
將”
||”視為字串的連線操作符而非或運算子,這和Oracle資料庫是一樣的,也和字串的拼接函式Concat相類似 ANSI_QUOTES: 啟用ANSI_QUOTES後,不能用雙引號來引用字串,因為它被解釋為識別符

我們可以使用

select @@global.sql_mode; //全域性配置

 查詢

也可以通過

select @@sql_mode;//已存在資料庫配置

查詢

二、解決方法

1.使用any_value()函式,這個函式對不需要group by的欄位有效,等同於關閉only_full_group_by,但是這樣難免會遺漏某個欄位,所以不推薦使用。

2.暫時性關閉(可以通過select @@sql_mode查出sql_mode以後去掉ONLY_FULL_GROUP_BY後複製過來

set sql_mode=' ' //改變已經存在的資料庫sql_mode
set @@global.sql_mode=' ' //改變全域性配置sql_mode

以上配置在重啟服務以後失效

3.更改配置檔案(推薦使用)

 linux系統更改/etc/my.cnf檔案,使用vi命令開啟,如果有sql_mode=...的註釋就把註釋開啟,如果沒有就加上sql_mode=...(可以通過select @@sql_mode查出sql_mode以後去掉ONLY_FULL_GROUP_BY後複製過來

 windows下配置檔案是安裝目錄下的my.ini檔案,其餘同上