今天在測試服務器上突然出現了這么一個MySQL的問題,同樣的代碼正式服沒有問題,那肯定就是出在了配置上,查了一下原因才明白原來是數據庫版本為5.7以上的版本,默認是開啟了 only_full_group_by
模式的,但開啟這個模式后,原先的 group by
語句就報錯,
查詢MySQL版本可以在命令行模式剛連接上數據庫時就能看到,或者在進入mysql后使用命令:status查看版本號,既然是版本的問題,那就查詢一下配置看看具體的情況,命令行連接上數據庫,再輸入命令:
select @@sql_mode;
你會看到sql_mode的配置情況:
其中ONLY_FULL_GROUP_BY就是造成這個錯誤的罪魁禍首了,對於group by聚合操作,如果在select中的列沒有在group by中出現,那么這個SQL是不合法的,因為列不在group by從句中,所以設置了sql_mode=only_full_group_by的數據庫,在使用group by時就會報錯,既然知道了問題,那么修改這個配置就可以了,找到MySQL的配置文件,在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
需要注意的一點是一定要添加在[mysqld]配置內,這樣添加完后重啟mysql才會生效,退出數據庫:exit,重啟命令:
service mysqld restart;
刷新頁面報錯信息消失成功解決,再次連接上數據庫查看sql_mode配置select @@sql_mode:
到此已經成功解決了這個問題。