1. 程式人生 > >MySQL 5.7版本sql_mode=only_full_group_by問題

MySQL 5.7版本sql_mode=only_full_group_by問題

MySQL 5.7版本sql_mode=only_full_group_by問題

具體出錯提示:

[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

產生原因:

使用 select @@sql_mode; 命令可以看到,資料庫設定了 ONLY_FULL_GROUP_BY 的mode

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

如何解決:

1、開啟cmd進入本機的mysql控制檯(懂開發的應該都會吧)

2、檢視sql_mode

進入資料庫執行下面兩個操作:發現問題

mysql> SELECT @@SESSION.sql_mode;
+--------------------------------------------------------------------------------------------------------------+    
    | @@SESSION.sql_mode                                                                                           |
+--------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT @@GLOBAL.sql_mode;
+--------------------------------------------------------------------------------------------------------------+
| @@GLOBAL.sql_mode                                                                                            |
+--------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+----

然後執行下面兩個步驟去掉ONLY_FULL_GROUP_BY,同時重新set

set sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' ;

set @@global.sql_mode    ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

或者:

在my.cnf 裡面設定

sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
在sql_mode 中去掉only_full_group_by

(拓展)其他的一些mode含義:

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

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