前言
环境
- 时间: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
已经没了。美滋滋!