開發(fā)環(huán)境連接的 mysql5.6
,而測試環(huán)境是 mysql5.7
。開發(fā)中有小伙伴寫了有關(guān) group by
的 sql
語句。在開發(fā)環(huán)境中運(yùn)行是正常的,而到了測試環(huán)境中就發(fā)現(xiàn)了異常。
原因分析:MySQL5.7
版本默認(rèn)設(shè)置了 mysql sql_mode = only_full_group_by
屬性,導(dǎo)致報(bào)錯(cuò)。
其中 ONLY_FULL_GROUP_BY
就是造成這個(gè)錯(cuò)誤的罪魁禍?zhǔn)琢?,在這種嚴(yán)格模式下,對(duì)于 group by
聚合操作,若在 select
中的列沒有在group by
中出現(xiàn),那么這個(gè) SQL
就是不合法的。因?yàn)殚_發(fā)寫的 sql
中,select
列不在 group by
從句中,在使用 group by
時(shí)就會(huì)報(bào)錯(cuò)。
測試環(huán)境下載安裝的是最新版的 mysql5.7.x
版本,默認(rèn)是開啟了 only_full_group_by
模式的。
1. 查看 sql_mode
SELECT` `@@sql_mode;
查詢出來的值為:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
2. 去掉ONLY_FULL_GROUP_BY,重新設(shè)置值。
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'``;
3. 上面是改變了全局sql_mode,對(duì)于新建的數(shù)據(jù)庫有效。
對(duì)于已存在的數(shù)據(jù)庫,則需要在對(duì)應(yīng)的數(shù)據(jù)下執(zhí)行
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'``;
以上方法mysql數(shù)據(jù)庫重啟后依然無效,下列方式重啟后依然生效
找到 MySQL
的配置文件,在 linux
系統(tǒng)上 /etc/my.cnf
文件,查詢 sql_mode
字段,我并沒有在配置文件中找到這個(gè)關(guān)鍵字,所以我手動(dòng)添加進(jìn)去:
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
需要注意的一點(diǎn)是一定要添加在 [mysqld]
配置內(nèi),這樣添加完后重啟mysql
才會(huì)生效,退出數(shù)據(jù)庫:exit,重啟命令:
service mysqld restart #lnmp重啟mysql lnmp restart mysql
刷新頁面報(bào)錯(cuò)信息消失成功解決,再次連接上數(shù)據(jù)庫查看 sql_mode
配置 select @@sql_mode
:
STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
到此這篇關(guān)于 Mysql5.7
及以上版本 ONLY_FULL_GROUP_BY
報(bào)錯(cuò)的解決方法的文章就介紹到這了,