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

mysql8,union,all,创建,视图,无法,使用,中文,模糊,查询 · 浏览次数 : 273

小编点评

## MySQL 视图 `jinanxiaolaohu3` 中 `col1` 中的中文模糊查询问题 **问题现象:** 使用 `mysql8.0.32` 创建的视图 `jinanxiaolaohu3` 中的 `col1` 中的中文模糊查询结果为空。 **分析:** * 视图的定义中使用 `union all` 连接 `jinanxiaolaohu1` 和 `jinanxiaolaohu2` 表。 * `jinanxiaolaohu1` 和 `jinanxiaolaohu2` 表中的 `col1` 列的字符集都设置为 `utf8`。 * `select * from jinanxiaolaohu3 where col1 like '济南小老虎%'` 这条查询在 `mysql8.0.26` 上可以正常执行,但在 `8.0.32` 上会返回空结果。 **猜测:** * `8.0.32` 中 `utf8` 字符集在 `union all` 中导致字段类型不可匹配错误。 * 视图中的 `col1` 列可能使用不同的字符集,导致模糊查询无法进行。 **解决方案:** 1. 尝试在 `my.ini` 中设置 `default-character-set` 为 `utf8`。 2. 尝试在视图中使用 `CONVERT` 或 `CAST` 函数进行字段转换。 3. 确保 `jinanxiaolaohu1` 和 `jinanxiaolaohu2` 表中字符集一致。 4. 尝试使用 `COLLATE` 选项在 `select` 语句中指定字符集。 **注意事项:** * 将 `default-character-set` 设置为 `utf8` 的操作可能影响数据库的正常运行,因此建议在生产环境中谨慎使用。 * 尝试使用 `CONVERT` 或 `CAST` 函数进行字段转换可能影响数据的精度,需要谨慎使用。 * 确保 `col1` 列的字符集一致,可以使用 `COLLATE` 选项进行指定。

正文

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也没有这个问题.

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

与Mysql8.0.32 union all创建视图无法使用中文模糊查询的坑相似的内容:

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

# Mysql8.0.32 union all创建视图无法使用中文模糊查询的坑 ## 摘要 ``` 本周研发同事反馈现场有一个问题. 客户使用mysql的数据库(Windows平台) 然后在多表union all 创建的视图内执行查询 如果使用中文模拟查询, 就没结果返回. 大部分csdn的搜索结构

【转帖】MySQL 8.0.32如期而至

MySQL 8.0版本计划 MySQL 8.0开始采用快速迭代开发模式,基本上是每隔3个月就发布一个新的小版本。去年1月18日(2022.1.18)发布MySQL 8.0.28,今年1月17日发布MySQL 8.0.32,再看看其他几个版本的时间,还真是贼守时啊。 版本发布时间上一年版本上一年发布时

docker 配置 Mysql主从集群

docker 配置Mysql集群 Docker version 20.10.17, build 100c701 MySQL Image version: 8.0.32 Docker container mysql-master is source. mysql-replica is replicat

[转帖]mysql8.0的RPM方式安装

https://www.cnblogs.com/asker009/p/15072354.html 1. 下载 https://dev.mysql.com/downloads/ 使用wget下载yum的源信息: wget -i -c https://dev.mysql.com/get/mysql57-

【转帖】【漏洞提示】MySQL8.0.29因重大bug官网已下架

前阵子,MySQL官网已经将 MySQL 8.0.29版本下架。据悉下架原因是由于MySQL 8.0.29 存在关于InnoDB解释器的重大Bug。而最新版本 8.0.30及以上的版本已修复此漏洞。各大镜像站也已经移除了 8.0.29 的下载。大家可根据自身项目实际情况进行升级。如果是现有版本使用的

[转帖]MySQL 8.0新特性和性能数据

https://plantegg.github.io/2022/07/03/MySQL8.0%E7%9A%84%E4%B8%80%E4%BA%9B%E6%95%B0%E6%8D%AE/ MySQL 8.0带来了很多新特性 针对性能方面介绍全在这个PPT( http://dimitrik.free.f

Linux与Windows系统字符集的简要学习

背景 最近同事反馈公司的产品再更新了mysql-8.0.31的驱动jar包后部分功能报错. 问题核心原因 研发这边石磊老师已经找到了. 结论是Mysql8.0.26之后的数据库驱动好像会识别操作系统的编码格式. 进而会导致尤其是stringbuilder等对象的序列化与反序列化的问题. 这里想简单复

记一次线上问题 → Deadlock 的分析与优化

开心一刻 今天女朋友很生气 女朋友:我发现你们男的,都挺单纯的 我:这话怎么说 女朋友:脑袋里就只想三件事,搞钱,跟谁喝点,还有这娘们真好看 我:你错了,其实我们男人吧,每天只合计一件事 女朋友:啥事呀? 我:这娘们真好看,得搞钱跟她喝点 问题复现 需求背景 MySQL8.0.30 ,隔离级别是默认

[转帖]CentOS8安装MySQL8详细教程,爬坑必备

https://www.ab62.cn/article/23022.html 安装环境 CentOS:8.5.2111MySQL:8.0.30 MySQL Community Server 安装过程 下载MySQL Yum Repository 官网查看MySQL的yum仓库列表,地址https:/

SQL窗口分析函数使用详解系列三之偏移量类窗口函数

1.综述 本文以HiveSQL语法进行代码演示。 对于其他数据库来说同样也适用,比如SparkSQL,FlinkSQL以及Mysql8,Oracle,SqlServer等传统的关系型数据库。 已更新第一类聚合函数类,点击这里阅读 ①SQL窗口函数系列一之聚合函数类 ②SQL窗口函数系列二之分组排序窗