MySQL 查询遇到Illegal mix of collations的错误

news2025/3/10 19:30:53

业务同学线上业务执行 SQL 时报错,

### Error querying database.  Cause: java.sql.SQLException: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,COERCIBLE) for operation 'like'

含义是对'like'操作非法混合了排序规则(utf8mb4_general_ci,IMPLICIT)和(utf8mb4_0900_ai_ci,COERCIBLE) ,所以大致猜想应该是 collation(排序规则)设置的问题。

业务执行出问题的查询语句为:

select * from fruits
where name like concat('%','爽爆🍋','%')

可以看到,这个语句中,用到了一个表情🍋,再看这张表的排序规则是 utf8mb4_general_ci 。

那就解释通了,原因是utf8mb4_general_ci对于表情的支持不是很好,当 where 条件中使用表情时,可能会出现非预期的结果,上述的例子就是其中一种。还有比较著名的 “sushi = beer”的问题:https://bugs.mysql.com/bug.php?id=76553,也是一个场景。

那么这个问题的解决方案就是:

使用 utf8mb4_0900_ai_ci 替换utf8mb4_general_ci

在 MySQL 8.0 中,默认字符集已从 latin1 更改为 ut8mb4。默认排序规则是 utf8mb4_0900_ai_ci,这也意味着 utf8mb4_0900*是更被推荐的。

所以 utf8mb4_0900_ai_ci 是什么呢?

首先我们要明白数据库中字符集和排序规则的含义。

字符集和排序规则

字符集(Character Set)是一组编码规则,用于将字符映射到数字编码。它定义了一个字符集合,并为每个字符分配要给唯一的编码值。常见的字符集包括 ASCII、UTF-8、UTF-16、GBK 等。

排序规则(collation): 定义了字符在排序和比较操作中的规则。它决定了字符之间的顺序、大小写敏感、重音符号等。排序规则是基于字符集的,同一个字符集可以有多个排序规则可供选择。例如,对于 utf-8 字符集来说,常见的排序规则有:utf8_general_ci、utf8_bin、utf8_0900_ai_ci。对于 utf8mb4 字符集来说,对应的排序规则则是:utf8mb4_general_ci、utf8mb4_bin、utf8mb4_0900_ai_ci。

扩展一下

Unicode和UTF-8有何区别?

Unicode和UTF-8是处理字符编码的两个相关概念,它们有以下区别:

定义和范围:Unicode是一个字符集,它定义了每个字符的唯一编码点。它为世界上几乎所有的字符分配了一个唯一的编码值,包括字母、数字、标点符号、符号、表情符号等。UTF-8是一种用于表示Unicode字符的编码方案,它定义了如何将Unicode字符编码为字节序列。

编码方式:Unicode使用固定的编码点来表示字符,每个字符都有一个唯一的编码值。UTF-8是一种可变长度的编码方案,它使用1到4个字节来表示不同的Unicode字符。根据字符的范围,UTF-8使用不同长度的字节序列来编码字符,从而实现更高的存储效率。

存储效率:由于UTF-8采用可变长度编码,它可以根据字符的范围选择适当长度的字节序列进行编码。对于只包含ASCII字符(0-127)的文本,UTF-8使用单个字节表示每个字符,与ASCII编码完全兼容,因此具有较高的存储效率。对于非ASCII字符,UTF-8使用多个字节表示,根据字符的范围选择适当长度的字节序列。

兼容性:Unicode是一个字符集,不依赖于特定的存储方式。UTF-8是Unicode的一种编码方案,它可以表示Unicode字符。UTF-8是一种广泛使用的编码方案,可以在各种计算机系统和应用程序之间进行交换和共享文本数据。

简单点来说就是Unicode只定义了字符集,但是UTF-8定义了编码格式。UTF的全称是Unicode Transformation Format,UTF-8则是它其中一个变换格式,还同时定义了编码格式(可变长度编码),此外还有UTF-16、UTF-32等等。

utf8和utf8mb4有何区别?

在MySQL数据库中,UTF-8被实现为一种最多使用3个字节的编码方式,被称为"utf8"。而utf8mb4使用最多4个字节来表示不同范围的Unicode字符。

在MySQL数据库中,"utf8"字符集实际上只支持部分的UTF-8编码范围,而"utf8mb4"字符集支持完整的UTF-8编码范围。因此,如果需要存储包括表情符号在内的广泛字符集,应该选择使用"utf8mb4"字符集。

回到正题,相比于旧的编码方式,utf8mb4_0900_ai_ci具有更好的排序规则和比较性能。它是基于Unicode Collation Algorithm (UCA) 的一种改进版本,能够更准确地排序和比较Unicode字符。

其中,utf8mb4代表字符集,0900代表是Unicode 9000规范,ai代表即不区分重音符号,ci代表不区分大小写。

新版本(8.0以上版本)中推荐使用utf8mb4_0900_ai_ci。

参考:https://www.lifesailor.me/archives/2676.html
https://www.modb.pro/db/100485

图片

点个“赞 or 在看” 你最好看!

喜欢,就关注我吧!

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1461328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qml 电池控件设计(手把手从零开始)

一、说明 做 qt 开发也有好几年了,一直基于QWidget 框架做的开发,使用重写 paint 函数实现各种显示效果,在复杂的 ui 开发中,控件一多或者刷新频率一高,其实也是存在性能限制。 一般来说,qt 的界面对象全部…

MKS T3BI集成蝶阀说明T3B-T3PRS-232Supplement

MKS T3BI集成蝶阀说明T3B-T3PRS-232Supplement

洛谷 P1016 [NOIP1999 提高组] 旅行家的预算【贪心】

原题链接:https://www.luogu.com.cn/problem/P1016 题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离 D1​、汽车油箱的容量 C(以升为单位)、每升汽…

计网day5

六 传输层 6.1 传输层概述 6.2 UDP协议 6.3 TCP协议 TCP连接管理: TCP可靠传输: TCP拥塞控制:

unity学习(32)——跳转到角色选择界面(父子类问题)

新问题 应该是两个脚本之间缺少继承关系 its children 解决起来很简单,把ResceneScript也绑到canvas上就可以了 。 此时,在账号密码正确的情况下,是可以完成场景切换。 对应的代码如下: TMP_Text d GameObject.FindWithTag(&…

【问题解决】删除node节点后如何把node节点重新加入

环境明细 docker版本: 25.0.3kubeadm 版本:v1.25.0 1 在master节点删除node节点 [rootk8s-master ~]# kubectl delete nodes k8s-node-02 node "k8s-node-02" deleted [rootk8s-master ~]# kubectl get nodes -o wide NAME STAT…

基于 GTSAM 的因子图简单实例

Title: 基于 GTSAM 的因子图简单实例 文章目录 I. 引言II. GTSAM 的安装与配置III. 基于 GTSAM 的因子图实例的 C 实现1. C 源码2. CMakeLists.txt 脚本3. 数值结果 IV. 基于 GTSAM 的因子图实例的 Python 实现1. Python 源码2. 数值结果3. 可视化结果 V. 总结 关联博文: 因子图…

day2:信号与槽

思维导图 使用手动连接,将登录框中的取消按钮使用t4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断u界面上输入的账号是否为"123",密码是否为"…

springboot集成JWT实现token权限认证

vuespringboot登录与注册功能的实现 注&#xff1a;对于JWT的学习&#xff0c;首先要完成注册和登录的功能&#xff0c;本篇博客是基于上述博客的进阶学习&#xff0c;代码页也是在原有的基础上进行扩展 ①在pom.xml添加依赖 <!-- JWT --> <dependency><grou…

【Linux】git操作 - gitee

1.使用 git 命令行 安装 git yum install git 2.使用gitee 注册账户 工作台 - Gitee.com 进入gitee&#xff0c;根据提示注册并登录 新建仓库 仓库名称仓库简介初始换仓库 3.Linux-git操作 进入仓库&#xff0c;选择“克隆/下载” 复制下面的两行命令进行git配置 然后将仓库clo…

Vue3引用第三方模块报错Could not find a declaration file for module ***.

在引用第三方的组件时候报错如下 原因是&#xff1a;该组件可能不是.ts文件而是.js文件 解决方案&#xff1a; 1.在Src的目录下面新建一个文件为shims-vue.d.ts的文件 2.文件内容为 declare module xxx&#xff0c;xxx就是你报错的模块 例如我这样 declare module vue3-pu…

【C语言】中的位操作符和移位操作符,原码反码补码以及进制之间的转换

欢迎大家来到c语言知识小课堂&#xff0c;今天的知识点是操作符和进制 目录 一、进制之间的转化1、什么是二进制&#xff0c;八进制&#xff0c;十进制&#xff0c;十六进制2、进制之间的转化其他进制转化为十进制十进制转化为二进制二进制转化为八进制八进制转化为二进制二进…

2023年最新阿里云服务器价格表(配置价格+磁盘+带宽)

2024年阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…

P2957 [USACO09OCT] Barn Echoes G

P2957 [USACO09OCT] Barn Echoes G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P2957 题目分析 对于求单个字符串的哈希值相当于求前缀和&#xff0c;而求单个字符串的子串的哈希值则相当于求其区间和&#xff1b; 那么只需求两个…

fail-safe机制与fail-fast机制分别有什么作用

fail-safe和fail-fast&#xff0c;是多线程并发操作集合时的一种失败处理机制。 Fail-fast&#xff1a;表示快速失败&#xff0c;在集合遍历过程中&#xff0c;一旦发现容器中的数据被修改了&#xff0c;会立刻抛出ConcurrentModificationException异常&#xff0c;从而导致遍…

Selenium基于Python web自动化测试框架 -- PO

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

代码随想录第二十一天 701.二叉搜索树中的插入操作 108.将有序数组转换为二叉搜索树

701.二叉搜索树中的插入操作 题目描述 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&a…

CF1468J Road Reform 题解

CF1468J Road Reform 题解 link CF1468J Road Reform 题面翻译 给定一个有 n n n 个节点&#xff0c; m m m 条无向带权边的图&#xff0c;和一个参数 k k k&#xff0c;第 i i i 条边权值为 s i s_i si​。 现在你要保留这个图中的 n − 1 n-1 n−1 条边使得这个图变…

306_C++_QT_创建多个tag页面,使用QMdiArea容器控件,每个页面都是一个新的表格[或者其他]页面

程序目的是可以打开多个styles文件(int后缀文件),且是tag样式的(就是可以切多个页面出来,并且能够单独关闭);其中读取ini文件,将其插入到表格中的操作,也是比较复杂的,因为需要保持RGB字符串和前面的说明字符串对齐 ini文件举例: [MainMenu] Foreground\Selected=&…

63-JQuery语法,选择器,事件,方法,遍历循环each

1.一个JS库,用js封装很多的方法放到一个文件里面,直接拿了用就可以 文件名带min是压缩过的不带min是没压缩过的 2.JQuery语法 通过选取HTML元素,并对选取的元素执行某些操作 基础语法:$(selector).action() <!-- 需要把JQuery文件先引入才能用 --><script src…