正文
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也没有这个问题.
客户现场中头彩..
建议升级版本.
能用商业数据库使用商业数据库.