前言

环境

  • 时间:2018 年 9 月 9 日;
  • MySQL 版本:8.0.12;

安装

最简单的安装方式就是使用 HomeBrew。

HomeBrew

使用 HomeBrew,一句命令就能安装好。

$ brew install mysql

使用

开启服务

$ brew services start mysql

设置 root 用户密码

$ mysqladmin -u root password 'PassWord'

解决 5.x 版本和 8.x 版本的认证兼容问题

可以登录 Mysql 的控制台或者在最新版的 Workbench 里面输入一下命令,就可以用 5.x 的认证方式连接了。

mysql > ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'PassWord'

取消 sql_mode 的 ONLY_FULL_GROUP_BY 设置

5.7 版本以后,MySQL 增加了 sql_mode 表示 SQL 模式。其中 ONLY_FULL_GROUP_BY 影响了我在使用 Sequelize 时的查询结果。如果设置了 ONLY_FULL_GROUP_BY,表示在分组聚合查询中,前面选择的列只能有两种,一种是分组的依据,一种是聚合操作的结果。但是 Sequelize 生成的语句还包括了其他列,因此如果设置了 ONLY_FULL_GROUP_BY,在分组查询中就会报错。需要取消该设置。

查询当前 sql_mode

mysql > SELECT @@GLOBAL.sql_mode;
mysql > SELECT @@SESSION.sql_mode;

通过以上两句命令查询全局和当前会话的 sql_mode,如果包含 ONLY_FULL_GROUP_BY,就需要设置一下了。

运行时临时设置

可以通过以下语句临时设置。将 <modes> 替换成目标模式,多个模式用逗号隔开。为了方便也可以直接用空字符串。

mysql > SET GLOBAL sql_mode = '<modes>';
mysql > SET SESSION sql_mode = '<modes>';

不过临时设置的缺点是如果数据库重启设置就会失效,所以还是通过配置文件永久修改比较好。

配置文件

MySQL 支持配置文件。配置文件的位置可以通过以下命令找到。

$ mysql --help | grep my.cnf

返回以下 4 个位置:

  • /etc/my.cnf
  • /etc/mysql/my.cnf
  • /usr/local/etc/my.cnf
  • ~/.my.cnf

我的情况是前两个文件为空,第三个文件被 Brew 设置了绑定 IP,于是我就按照第三个文件的格式创建了第四个文件。

# User Custom MySQL server config
[mysqld]
# disable ONLY_FULL_GROUP_BY
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

然后重启一下数据库,发现 ONLY_FULL_GROUP_BY 已经没了。美滋滋!

参考资料