mysql5.7中的sql_mode含有only_full_group_by,sql語句中含有g(shù)roupby時,只能獲取受到影響的字段信息,無法和其它未受影響的字段共存,這樣之前老項目里有很多不規(guī)范的語法,改起來太麻煩,所以只能關(guān)閉only_full_group_by模式。
1.確認sql_mode的值
select @@sql_mode;
mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
可以看到查出來的值里有ONLY_FULL_GROUP_BY
2.去掉ONLY_FULL_GROUP_BY,重新設置新值
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';
這種通過sql語句設置的sql_mode值只是臨時的,如果mysql重啟后則會又開啟ONLY_FULL_GROUP_BY
永久生效需要修改my.cnf(windows下是my.ini)配置文件,把sql_mode設置成正確的
root@localhost:/xiannv/mysql/conf# cat my.cnf
[mysqld]
user=mysql # MySQL啟動用戶
default-storage-engine=INNODB # 創(chuàng)建新表時將使用的默認存儲引擎
character-set-server=utf8 # 設置mysql服務端默認字符集
pid-file = /var/run/mysqld/mysqld.pid # pid文件所在目錄
socket = /var/run/mysqld/mysqld.sock # 用于本地連接的socket套接字
datadir = /var/lib/mysql # 數(shù)據(jù)文件存放的目錄
log-error = /var/log/mysql/error.log
#bind-address = 127.0.0.1 # MySQL綁定IP
expire_logs_days=7 # 定義清除過期日志的時間(這里設置為7天)
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION # 定義mysql應該支持的sql語法,數(shù)據(jù)校驗等!
# 允許最大連接數(shù)
max_connections=200
# ================= ↓↓↓ mysql主從同步配置start ↓↓↓ =================
# 同一局域網(wǎng)內(nèi)注意要唯一
server-id=1
# 開啟二進制日志功能
log-bin=mysql-bin
# ================= ↑↑↑ mysql主從同步配置end ↑↑↑ =================
[client]
default-character-set=utf8 # 設置mysql客戶端默認字符集
3.保存重啟
重啟發(fā)現(xiàn)ONLY_FULL_GROUP_BY模式仍然為開啟狀態(tài),看日志后發(fā)現(xiàn)如下提示:

image.png
大概意思就是說權(quán)限是全局可寫的,太高了,mysql對這種文件有保護機制,防止被其他用戶惡意修改,所以給忽略掉了,導致my.cnf文件根本沒生效,所以必須要修改權(quán)限才行
chmod 644 my.cnf
重啟后發(fā)現(xiàn)問題解決
mysql> select @@sql_mode;
+----------------------------------------------------------------------------------------------------+
| @@sql_mode |
+----------------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)