当前位置: 代码网 > it编程>数据库>Mysql > MySQL 8.0.26版本升级32版本查询数据为空的解决方案

MySQL 8.0.26版本升级32版本查询数据为空的解决方案

2024年05月18日 Mysql 我要评论
某业务系统将mysql 8.0.26升级为greatsql 8.0.32-24 后,某些特定的sql语句不能查询到数据。经测试 mysql 8.0.32也存在相同的问题此bug已在 greatsql

某业务系统将mysql 8.0.26升级为greatsql 8.0.32-24 后,某些特定的sql语句不能查询到数据。经测试 mysql 8.0.32也存在相同的问题

此bug已在 greatsql 8.0.32-25 版本中解决

mysql 8.0.26版本升级32版本查询数据为空的跟踪

接到客户反馈的问题后,对问题进行了复现和分析。

版本信息

greatsql> select version();
+-----------+
| version() |
+-----------+
| 8.0.32-24 |
+-----------+
1 row in set (0.00 sec)

建表语句

greatsql> show create table t_student;
create table `t_student1` (
  `id` int not null auto_increment,
  `name` varchar(255) not null,
  `age` int not null,
  primary key (`id`)
) engine=innodb auto_increment=3 default charset=utf8mb4 collate=utf8mb4_0900_ai_ci;

表数据

greatsql> select * from t_student;
+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  1 | abc    |  10 |
|  2 | 汤姆   |  20 |
+----+--------+-----+
2 rows in set (0.08 sec)

查询数据

greatsql>  select * from (select * from t_student union select * from t_student) temp where name='汤姆';
empty set, 2 warnings (0.00 sec)
greatsql> show warnings;
+---------+------+-------------------------------------------------------------------------+
| level   | code | message                                                                 |
+---------+------+-------------------------------------------------------------------------+
| warning | 1300 | cannot convert string '\xe6\xb1\xa4\xe5\xa7\x86' from utf8mb4 to binary |
| warning | 1300 | cannot convert string '\xe6\xb1\xa4\xe5\xa7\x86' from utf8mb4 to binary |
+---------+------+-------------------------------------------------------------------------+
2 rows in set (0.00 sec)
greatsql> select * from (select * from t_student union select * from t_student) temp;
+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  1 | abc    |  10 |
|  2 | 汤姆   |  20 |
+----+--------+-----+
2 rows in set (0.00 sec)
greatsql> select * from (select * from t_student union select * from t_student) temp where name='abc';
+----+------+-----+
| id | name | age |
+----+------+-----+
|  1 | abc  |  10 |
+----+------+-----+
1 row in set (0.00 sec)

可以看到 直接查询temp这个view或者 在视图上添加英文过滤条件均能查询出数据,在view上添加中文过滤条件sql语句返回结果为空,有warnings提醒,warnings具体内容为cannot convert string

在官方网站进行搜索,以下连接有相似内容:

https://bugs.mysql.com/bug.php?id=110228

https://bugs.mysql.com/bug.php?id=110955

mysql 8.0.32版本中对于union/union all 后的结果中的字符串字段过滤筛选不生效,客户端中提示:

cannot convert string '%\x...' from utf8mb4 to binary

官方已确认是8.0.32中的一个bug,已在8.0.33版本中修复,对于8.0.32版本,官方给出的解决方式如下:

set optimizer_switch="derived_condition_pushdown=off";

让所有session都生效,需要在配置文件中将optimizer_switch设置为off

此bug已在 greatsql 8.0.32-25 版本中解决

解决方法

方法一:

设置set optimizer_switch="derived_condition_pushdown=off";后sql语句能正常执行

greatsql> set optimizer_switch='derived_condition_pushdown=off';
query ok, 0 rows affected (0.00 sec)
greatsql> select * from (select * from t_student union select * from t_student) temp where name='汤姆';
+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  2 | 汤姆   |  20 |
+----+--------+-----+
1 row in set (0.00 sec)

方法二:

对单个sql语句设置no_derived_condition_pushdown hint

greatsql> set optimizer_switch='derived_condition_pushdown=on';
query ok, 0 rows affected (0.00 sec)
greatsql> select * from (select * from t_student union select * from t_student) temp where name='汤姆';
empty set, 2 warnings (0.00 sec)
greatsql> select  /*+ no_derived_condition_pushdown(temp) */ * from (select * from t_student union select * from t_student) temp where name='汤姆';
+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  2 | 汤姆   |  20 |
+----+--------+-----+
1 row in set (0.00 sec)

enjoy greatsql 😃

关于 greatsql

greatsql是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为mysql或percona server的可选替换,用于线上生产环境,且完全免费并兼容mysql或percona server。

相关链接: greatsql社区 giteegithubbilibili

greatsql社区:

社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

到此这篇关于mysql 8.0.26版本升级32版本查询数据为空的跟踪的文章就介绍到这了,更多相关mysql查询数据为空内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com