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

1、出錯緣由mysql

最近由於開發數據庫與部署數據庫版本不一樣,帶來了幾個問題,其中only_full_group_by問題是以前沒有遇到的。linux

     具體報錯以下sql

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的做用是什麼呢?windows

模式定義mysql會支持哪些sql語法。以及應執行哪一種數據驗證檢查。最終達到的目標:適應在不一樣環境中適應mysql,由於可

以根據各自的程序設置不一樣的操做模式。

 

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

做爲分組依據,這裏是要查詢的全部字段。this

另外經常使用的sql_mode有:spa

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後,不能用雙引號來引用字符串,由於它被解釋爲識別符

咱們可使用code

select @@global.sql_mode; //全局配置

 查詢orm

也能夠經過

select @@sql_mode;//已存在數據庫配置

查詢

2、解決方法

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文件,其他同上

相關文章
相關標籤/搜索