1、問題復現:
今天在進行數據遷移時,使用Navicat連接數據庫進行連接時,由於 SQL語句中使用了 group by分組函數,結果報了如下錯誤:
2、產生原因
產生原因說是,在MySQL數據庫版本為5.7以上的版本,默認開啟了 ONLY_FULL_GROUP_BY SQL模式,在此模式下,對於group by操作,如果在select語句中的查詢列沒有在group by中出現,那么這個SQL就是非法的,因為列不在group by語句中,所以設置了sql_mode=only_full_group_by的數據庫,在使用group by時就會報錯。
3、問題解決
既然是 MySQL配置問題,找到了原因,就好對症下葯進行解決了。
方法一:
在Navicat中,輸入下列SQL語句進行查詢:
SELECT @@GLOBAL.sql_mode;
查詢結果如下:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
通過上面的查詢結果,可以看到 開啟了 ONLY_FULL_GROUP_BY 模式,這里第一種解決方案就是,去除 ONLY_FULL_GROUP_BY,重新設置值。
解決方法如下:
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';
執行完上面的SQL語句之后,再次執行報錯的SQL語句,發現可以正常運行了。
方法二:
除了上面的手動設置sql_mode值之外,還可以在 MySQL 的配置文件中進行設置。
1、對於 Linux系統,進到 /etc/my.cnf 文件下,查詢sql_mode字段,由於在配置文件中未找到這個關鍵字,所以我在
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
添加完之后,保存退出,重啟 MySQL 即可生效。
2、對於windows系統,進行 MySQL安裝目錄下,找到 my.ini 文件,同樣在配置文件中搜索sql_mode關鍵字,
若未搜索到,則需要在 [mysqld] 配置中手動添加進去:
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
添加完畢之后,保存退出,然后重啟一下 MySQL 服務即可生效。
參考鏈接: