mysql5.7中的sql_mode含有only_full_group_by,sql语句中含有groupby时,只能获取受到影响的字段信息,无法和其它未受影响的字段共存,这样之前老项目里有很多不规范的语法,改起来太麻烦,所以只能关闭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 # 创建新表时将使用的默认存储引擎
character-set-server=utf8 # 设置mysql服务端默认字符集
pid-file = /var/run/mysqld/mysqld.pid # pid文件所在目录
socket = /var/run/mysqld/mysqld.sock # 用于本地连接的socket套接字
datadir = /var/lib/mysql # 数据文件存放的目录
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语法,数据校验等!
# 允许最大连接数
max_connections=200
# ================= ↓↓↓ mysql主从同步配置start ↓↓↓ =================
# 同一局域网内注意要唯一
server-id=1
# 开启二进制日志功能
log-bin=mysql-bin
# ================= ↑↑↑ mysql主从同步配置end ↑↑↑ =================
[client]
default-character-set=utf8 # 设置mysql客户端默认字符集
3.保存重启
重启发现ONLY_FULL_GROUP_BY模式仍然为开启状态,看日志后发现如下提示:
大概意思就是说权限是全局可写的,太高了,mysql对这种文件有保护机制,防止被其他用户恶意修改,所以给忽略掉了,导致my.cnf文件根本没生效,所以必须要修改权限才行
chmod 644 my.cnf
重启后发现问题解决
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)
网友评论