1、原因分析
這個錯誤發生在mysql 5.7 版本及以上版本會出現的問題:mysql 5.7版本默認的sql配置是:sql_mode="ONLY_FULL_GROUP_BY",這個配置嚴格執行了"SQL92標准"。
很多從5.6升級到5.7時,為了語法兼容,大部分都會選擇調整sql_mode,使其保持跟5.6一致,為了盡量兼容程序。
在sql執行時,出現該原因:簡單來說就是:輸出的結果是叫target list,就是select后面跟着的字段,還有一個地方group by column,就是group by后面跟着的字段。由於開啟了ONLY_FULL_GROUP_BY的設置,所以如果一個字段沒有在target list和group by字段中同時出現,或者是聚合函數的值的話,那么這條sql查詢是被mysql認為非法的,會報錯誤。
2、查看sql_mode
語句如下
select @@GLOBAL.sql_mode;
結果如下:
3、解決方案
需修改mysql配置文件,通過手動添加sql_mode的方式強制指定不需要ONLY_FULL_GROUP_BY屬性,my.cnf位於etc文件夾下(windows中為my.ini),在mysqld下添加如下:
sql_mode ='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'
如下:
[client] # 設置mysql客戶端默認字符集 default-character-set=utf8 [mysqld] # 設置3306端口 port = 3306 # 設置mysql的安裝目錄 basedir=D:\install\mysql-8.0.26-winx64 # 設置 mysql數據庫的數據的存放目錄,MySQL 8+ 不需要以下配置,系統自己生成即可,否則有可能報錯 datadir=D:\install\mysql-8.0.26-winx64\data # 允許最大連接數 max_connections=200 # 服務端使用的字符集默認為8比特編碼的latin1字符集 character-set-server=utf8 # 創建新表時將使用的默認存儲引擎 default-storage-engine=INNODB log_bin_trust_function_creators=1 sql_mode ='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'
重啟mysql服務,順利解決。