Mysql8.0.32 union all创建视图无法使用中文模糊查询的坑

发布时间 2023-06-14 19:08:21作者: 济南小老虎

Mysql8.0.32 union all创建视图无法使用中文模糊查询的坑


摘要

本周研发同事反馈现场有一个问题. 
客户使用mysql的数据库(Windows平台)
然后在多表union all 创建的视图内执行查询
如果使用中文模拟查询, 就没结果返回. 

大部分csdn的搜索结构都是说需要在my.ini里面增加部分默认字符集的配置.
但是反馈并没有解决. 

周三下午实在有点被问烦了. 
然后跟公司内数据库专家方神一起进行一下验证发现是mysql的一个坑.

csdn要求添加的配置

在mysql中的my.ini 文件中

在[mysql]下面添加: default-character-set=utf8
在[client]下面添加:default-character-set=utf8
在[mysqld]下面添加:character-set-server=utf8

来源:https://blog.csdn.net/m0_37468234/article/details/80247910

结论是: 然并卵

尝试验证

客户那边给的配置文件里面看到版本是 Mysql8.0.32
所以猜测是不是数据库有bug (只要是人写的就有bug)
但是有不太确认, 只能够进行相关的测试验证. 
主要的办法就是下载 安装 测试 

下载地址: https://dev.mysql.com/downloads/
下载的文件主要有两个:
mysql-8.0.32-winx64.zip
mysql-8.0.33-winx64.zip

Windows 平台快速创建

配置文件:
[mysqld]
datadir=C:\mysql\data
max_allowed_packet = 1G
innodb_log_file_size = 512M
innodb_log_buffer_size = 512M
innodb_file_per_table = 1
innodb_buffer_pool_size=8G
innodb_flush_log_at_trx_commit=0
#innodb_file_format=barracuda
max_connections=2000
lower-case-table-names=1
innodb_strict_mode = 0
character_set_server=utf8
secure_file_priv = 
#character_set_results=utf8
default-time-zone='+08:00'
expire_logs_days = 1
transaction-isolation = READ-COMMITTED
default_authentication_plugin=mysql_native_password
#skip-grant-tables
skip-log-bin 
[mysql]
prompt="\\u@\\h : \\d \\r:\\m:\\s>"
default-character-set=utf8

初始化以及启动服务

mysqld --defaults-file="c:\mysql\my.ini" --initialize

mysqld --remove  MySQL
mysqld --install  MySQL --defaults-file="D:\mysql\my.ini"
net start MySQL

注意默认密码在 c:\mysql\data\computername.err 里面.

SQL验证

使用navicat 连接数据库, 设置默认密码后进行如下处理

创建数据库 可以还是用GUI方式创建, 注意我这边是utf8 的字符集

测试SQL主要如下:
create table jinanxiaolaohu1 (col1 varchar(2000));
create table jinanxiaolaohu2 (col2 varchar(2000));

insert into jinanxiaolaohu1 (col1) values ("济南小老虎中文English123402");
insert into jinanxiaolaohu2 (col2) values ("济南小老虎测试中文English123401");
create view jinanxiaolaohu3  as select col1 from jinanxiaolaohu1  union all select col2 from jinanxiaolaohu2 ;

# 这个查询结果 8.0.32 就反馈为空. 
select * from jinanxiaolaohu3  where col1 like '济南小老虎%' ;

升级Mysql8.0.33进行再次验证

# 注意如果是生产环境务必要进行一下数据库备份. 
# 我这边是测试的 就无所谓了. 
关闭服务
net start MySQL
将mysql8.0.33的文件覆盖到 mysql8.0.22 的目录
执行
net start MySQL

同样的执行SQL
select * from jinanxiaolaohu3  where col1 like '济南小老虎%' ;
发现就可以查询出结果来了

产品已有的数据库版本验证

我们这边使用的是Mysql8.0.26 docker版本
也进行了一下验证也没问题. 
特意尝试了下之前写blog的Mysql8.0.31也没有这个问题.

客户现场中头彩.. 
建议升级版本. 
能用商业数据库使用商业数据库.