首页 > MySQL > 关于 MySQL 的三个小问题

关于 MySQL 的三个小问题

2024年10月19日 发表评论 阅读评论

之前曾经写过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 即可。

全文完,如果本文对您有所帮助,请花 1 秒钟帮忙点击一下广告,谢谢。

作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/768
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
  1. 本文目前尚无任何评论.

请输入正确的验证码