解决mysql 模糊搜索表情包 编码报错 Illegal mix of collations

本文主要是介绍解决mysql 模糊搜索表情包 编码报错 Illegal mix of collations,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求: 对微信Id和微信名称进行模糊搜索,搜索字段中可能会出现表情
问题: mysql 中对微信名中进行模糊搜索会出现mysql编码报错,wx_id字段会报错,nickname字段不会。
SELECTwx_id 
FROMwx_fans 
WHEREwx_id LIKE '💊' or nickname LIKE '💊'

Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,COERCIBLE) for operation 'like'

排查后发现是字段编码不同wx_id( utf8_general_ci) nickname(utf8mb4_general_ci)
两者区别:MySQL在5.5.3之后增加了utf8mb4的编码,mb4就是dumost bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。
在这里插入图片描述

解决方案:
1.修改Mysql字段编码
2.在Java代码层面解决
  • 用一个表情编码器来判断查询 字段中是否包含表情
public static boolean containsEmoji(String source) {int len = source.length();boolean isEmoji = false;for (int i = 0; i < len; i++) {char hs = source.charAt(i);if (0xd800 <= hs && hs <= 0xdbff) {if (source.length() > 1) {char ls = source.charAt(i + 1);int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;if (0x1d000 <= uc && uc <= 0x1f77f) {return true;}}} else {// non surrogateif (0x2100 <= hs && hs <= 0x27ff && hs != 0x263b) {return true;} else if (0x2B05 <= hs && hs <= 0x2b07) {return true;} else if (0x2934 <= hs && hs <= 0x2935) {return true;} else if (0x3297 <= hs && hs <= 0x3299) {return true;} else if (hs == 0xa9 || hs == 0xae || hs == 0x303d|| hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c|| hs == 0x2b1b || hs == 0x2b50 || hs == 0x231a) {return true;}if (!isEmoji && source.length() > 1 && i < source.length() - 1) {char ls = source.charAt(i + 1);if (ls == 0x20e3) {return true;}}}}return isEmoji;}
  • 如果有表情 => nickname模糊搜索,没用表情包 =>nickname或wxId模糊搜索。(wxId中不会有表情,没必要搜索,但不知道用户输入的是wxId还是nickname)
问题:使用正常直到遇到了一个新的表情🦄,排除原因后发现,表情编码器中的表情能判断的表情是有限的,不能保证用户所搜索的表情都包含在内。
解决方案:

先使用wxId和nickname执行一遍模糊查询,如果报指定的异常,说明搜索中包含这个表情,再捕获异常,只用wxId进行模糊搜索

try {aiRepeatFriends = aiAssistantManagementMapper.repeatFriendsMonitor(req.getQuery(), comId, req.buildRowBounds(), groupId, emjor);
} catch (Exception e) {log.info("存在未知表情,搜索失败 请求数据:{}", JSON.toJSONString(req));log.error("错误详情:{}",e);if(e.getMessage().contains("Illegal mix of collations")){emjor = "emjor";aiRepeatFriends = aiAssistantManagementMapper.repeatFriendsMonitor(req.getQuery(), comId, req.buildRowBounds(), groupId, emjor);}else{throw e;}
}
问题: 在搜索时又遇到了一个新问题,用一个表情进行搜索,却把其他表情结果也都搜索出来了
解决方案:mysql二进制搜索(其实只要用了二进制搜索也不会编码报错)
BINARY(wgf.nickname) LIKE #{search}

这篇关于解决mysql 模糊搜索表情包 编码报错 Illegal mix of collations的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/349526

相关文章

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

MySQL数据库约束深入详解

《MySQL数据库约束深入详解》:本文主要介绍MySQL数据库约束,在MySQL数据库中,约束是用来限制进入表中的数据类型的一种技术,通过使用约束,可以确保数据的准确性、完整性和可靠性,需要的朋友... 目录一、数据库约束的概念二、约束类型三、NOT NULL 非空约束四、DEFAULT 默认值约束五、UN

电脑找不到mfc90u.dll文件怎么办? 系统报错mfc90u.dll丢失修复的5种方案

《电脑找不到mfc90u.dll文件怎么办?系统报错mfc90u.dll丢失修复的5种方案》在我们日常使用电脑的过程中,可能会遇到一些软件或系统错误,其中之一就是mfc90u.dll丢失,那么,mf... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

MySQL 多表连接操作方法(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)

《MySQL多表连接操作方法(INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLOUTERJOIN)》多表连接是一种将两个或多个表中的数据组合在一起的SQL操作,通过连接,... 目录一、 什么是多表连接?二、 mysql 支持的连接类型三、 多表连接的语法四、实战示例 数据准备五、连接的性

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊