解决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

相关文章

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

解决Spring运行时报错:Consider defining a bean of type ‘xxx.xxx.xxx.Xxx‘ in your configuration

《解决Spring运行时报错:Considerdefiningabeanoftype‘xxx.xxx.xxx.Xxx‘inyourconfiguration》该文章主要讲述了在使用S... 目录问题分析解决方案总结问题Description:Parameter 0 of constructor in x

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约