关于 MySQL 的三个小问题
之前曾经写过MySQL的一个小问题,就是 MySQL 如果采用的字符集是 utf8 的话,emoji 的话,是存不进去的,因为历史原因 MySQL 的 utf8 不是真正的 utf8,utf8mb4 才是真正的 utf8,所以在创建数据库的时候编码集推荐选择 真正的 utf8mb4。今天就再写两个小问题:
1. allowMultiQueries=true
前一段时间同事有个需求,使用 mybatis 的时候,在同一个 mapper 方法中需要同时执行两个 MySQL 语句,当时同事说他把 SQL 拷贝出来执行都没有问题,但是在代码中执行就是报错,让我帮忙看一下原因,当时听他描述,我大概猜到了,然后一看果然就是在一个 mapper 方法中同时执行两个 SQL 语句,在 MySQL 的连接中加上 allowMultiQueries=true 搞定。
2. MySQL8.0 中 group by 报错的问题
可能因为我一直在互联网公司的原因,所以在我的职业生涯中,一直都是 MySQL,前几年在 MySQL8.0 还没成为主流,主流还是使用 5.6 的时候,有个刚入职不久的同事问如下的语句:
select a, b from t_test group by a
说不报错吗?当时我很懵,不报错啊,代码中很多地方我也一直这么写啊,然后同事说他之前用 oracle 是不行的,然后到 MySQL5.7 之后,发现 MySQL 默认也不能这么写了,其实解决起来也很简单。
第一种方案:
修改 MySQL 的语句:
select a from t_test group by a
或者:
select a, b from t_test group by a, b
又或者:
select a, any_value(b) from t_test group by a
但是对于一个长期项目来说,这么改工作量肯定很多,不一定带来什么问题,所以就还有第二种方案:
在客户端输入:
SELECT @@sql_mode;
输出的结果类似于:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
把这个结果集中的 ONLY_FULL_GROUP_BY 去掉,执行:
set global sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
然后就可以了,但是这有一个问题,如果重启 MySQL 就会又报错,所以可以直接修改 MySQL 的配置文件: my.conf,在 [mysqld] 模块中增加:
sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
然后重启即可永久生效。
3. useSSL=true
当 MySQL 的版本和 JDBC 的版本不一致,项目启动时会报错,这个时候就需要把 useSSL=true 改成 useSSL=false 即可。
作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/768
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
近期评论