解决mysql存储emoji表情唯一索引报错问题

news2024/11/17 13:52:35

问题发现:

1、正常上班的一天,突然间有运营同事反馈,我们在添加数据的时候,发现添加了🐸之后,对应的💩没有了,添加了💩然后🐸就没有了,需要研发帮忙分析一下为什么。

原因分析:

1、从运营的反馈我第一印象应该是前端搞错了,把本应该调用新增的接口调错成了修改接口,于是让前端先排查,前端反馈新增和修改是同一个接口,这着实让我心头一紧,咋回事?程序BUG了?

2、一通排查一下了,程序并没有发现什么问题,可为什么会被替换了?只能继续向后排查,那就到了MySQL了。我们使用的是INSERT INTO ON DUPLICATE KEY UPDATE,针对该字段使用了唯一索引,如果发现存在相同的值就直接替换掉,建表语句如下:

CREATE TABLE `du_test` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`tt` VARCHAR(50) NOT NULL DEFAULT '' COLLATE 'utf8mb4_general_ci',
	PRIMARY KEY (`id`) USING BTREE,
	UNIQUE INDEX `tt` (`tt`) USING BTREE
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=4
;

3、当我们插入了💩以后,再插入一下🐸,就会报唯一键冲突错误:

 4、明明💩和🐸是不同的字符,单独存储也都没有问题,可为什么在唯一键验证的时候,会报冲突的错误的,这个时候突然间想起来了字符集的比较规则,也就是MySQL的关键字:

COLLATE='utf8mb4_general_ci'

utf8mb4 默认排序规则是utf8mb4_general_ci,它只区分 BMP 字符,而我们的emoji字符其实不在这个范围内的,也就是唯一索引校验的时候,根本就不会对带上emoji字符,知道原因之后,那就需要找一种能处理emoji字符的比较规则。

解决方案:

1、_bin的比较规则是怎么比较的?

二进制字符串是字节序列。对于binary collation,比较和排序基于字节数字值。非二进制字符串(CHAR, VARCHAR,TEXT )是字符序列,可能是多字节的。非二进制字符串的比较规则定义了用于比较和排序的字符值的顺序。对于_bin collation,这种排序基于字符代码数字值,这与二进制字符串的排序类似,只是字符代码值可能是多字节的。

2、修改原来的字段的字符集为utf8mb4_bin,问题解决

CREATE TABLE `du_test_1` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`tt` VARCHAR(50) NOT NULL DEFAULT '' COLLATE 'utf8mb4_bin',
	PRIMARY KEY (`id`) USING BTREE,
	UNIQUE INDEX `tt` (`tt`) USING BTREE
)
COMMENT='名单操作历史表'
COLLATE='utf8mb4_bin'
ENGINE=InnoDB
AUTO_INCREMENT=8
;

3、测试:

 从上图可以看到,🐸和💩都正常插入进去了。

最后:

很多文档或者工具把MySQL的COLLATE翻译成排序规则,我认为稍微有点欠妥,或者说不够直观,其实它的英文是“perform comparisons according to a variety of collations”,翻译成比较规则更合适一些,需要排序的场景肯定需要比较,需要比较的场景不一定需要排序。

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

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

相关文章

【Linux】四、Linux 进程概念(四)|进程地址空间

目录 十、进程地址空间 10.1 回顾C/C 地址空间 10.2 测试 10.3 感性理解虚拟地址空间 10.4 如何画大饼? 10.5 如何理解区域划分和区域调整 10.6 虚拟地址空间、页表和物理地址 10.7 为什么存在地址空间 10.7.1 保证物理内存的安全性 10.7.2 保证进程的独立…

铁蛋白-海藻酸钠纳米包埋ACE抑制肽|海藻酸钠修饰碳纳米管(SAL-MWNTs)

铁蛋白-海藻酸钠纳米包埋ACE抑制肽|海藻酸钠修饰碳纳米管(SAL-MWNTs) 铁蛋白-海藻酸钠纳米包埋ACE抑制肽产品描述:利用铁蛋白在较酸条件下可逆组装特性和海藻酸钠(sodium alginate,SA)的控释作用,以马脾脱铁铁蛋白(horse spleen apoferritin,HSF)和SA作为纳米载体,…

Rust 基础(八)—— 高级特性

十九、高级特性 到目前为止,您已经学习了Rust编程语言最常用的部分。在我们开始第20章的下一个项目之前,我们先来看一下你可能偶尔会碰到,但不是每天都在使用的语言的一些方面。当你遇到任何未知的情况时,你可以使用这一章作为参…

[毕业设计]2022-2023年最新最全计算机专业毕设选题推荐汇总

目录 ①javaweb信息管理系统或web应用选题(应用开发类) ②微信小程序开发方向 ③游戏动画、数字媒体方向 ④深度学习、机器学习方向 ⑤算法研究方向 ⑥物联网、嵌入式方向 ⑦信息安全、网络安全 ⑧大数据分析、大数据预测 ⑨Matlab 选题迷茫 选题的重要性 选题指导 对毕…

Springboot利用Security做OAuth2资源服务器

Springboot利用Security做OAuth2授权验证_LO嘉嘉VE的博客-CSDN博客_springbootsecurity oauth2 密码认证 验证服务器在上一篇文章中. 验证服务器是做权限验证,有没有登录,有没有权限访问某些内容等。资源服务器指提供业务功能的服务器,他们…

使用idea创建springboot项目

一、第一种创建方法 点击File——>New——>Project 接下来选择空项目,如下图所示: 接下来点击Next——>项目名称——>finish 点击finish后会弹出如下图,让你新建一个Moudles 如下图, 在项目结构里面点击Modules——…

Kubeadm 部署 k8s 集群

目录 1.初始化设置 2.所有节点安装docker 3.k8s节点安装kubeadm,kubelet和kubectl 4.部署K8S集群 5.部署Dashboard 6.部署harbor私有仓库 名称设置组件master192.168.116.70(2C/4G,cpu核心数要求大于2)docker、kubeadm、ku…

南开大学程明明-学术规范及论文写作指导

第一讲 学术规范与论文写作-写作规范 主要内容 why writing is important 导致剽窃的原因(引用不当也会导致): 引用不是介绍别人的工作,而是更加清晰介绍自己的工作 第二讲 学术规范与论文写作-WrittingTips 各种工具的使用 Ove…

s5pv210 i2c 时序

1 低层时序 ①. 底层时序 ******** 低层时序: ①.空闲: scl clk都是高电平②.起始位: 一个时间段,这个段时间内,SCL高电平, SDA 出现下降沿 , 接收方收到以后,知道了,…

为什么在 2023 年只使用 console.log 是一个大禁忌

这里有 5 个必须知道的控制台对象方法和技巧! 在 2023 年,您是否仍在使用它console.log来满足所有 JavaScript 调试需求? 是时候提升您的技能并发现 JavaScript 控制台对象的全部功能了。 从console.table到console.time,这些高…

CFD-Post后处理,你真的会做吗?

导读:流体仿真中,解决问题通常分为四个步骤:几何—网格—求解—后处理。今天我们来学习最后一步:后处理。尤其对新手来说,首先要了解一下什么是后处理? 我们通过软件计算收敛后的得到的结果,只…

Python学习笔记-面向对象程序设计

记述python中关于面向对象程序设计的使用。 一、面向对象概述 面向对象(Object Oriented),简称OO; 面向对象编程(Object Oriented Programming),简称OOP。 1.对象 英文为Object&#xff0c…

IMX6ULL学习笔记(13)——GPIO接口使用【汇编方式】

一、GPIO简介 i.MX6ULL 芯片的 GPIO 被分成 5 组,并且每组 GPIO 的数量不尽相同,例如 GPIO1 拥有 32 个引脚, GPIO2 拥有 22 个引脚, 其他 GPIO 分组的数量以及每个 GPIO 的功能请参考 《i.MX 6UltraLite Applications Processor Reference M…

vTESTstudio入门到精通 - vTESTstudio工程创建_01

入行车载网络测试多年以来,最大的困扰就是网上几乎无法搜到工作中常见的问题答案,特别是vTESTstudio的工程和开发相关的问题,在晚上几乎就是一片未知的大陆,偶尔有几篇同行写的,基本也都是某个问题或者某个demo的创建基础讲解,至今我还未找到有博主将vTESTstudio从入门的…

艾美捷—如何选择合适的SAM甲基转移酶活性分析试剂盒?

SAM,也称为 AdoMet,充当修饰蛋白质和 DNA 所需的甲基的供体。SAM 的异常水平与许多异常有关,包括阿尔茨海默氏症、抑郁症、帕金森氏症、多发性硬化症、肝功能衰竭和癌症。 市面上,SAM甲基转移酶酶活性分析试剂盒非常少&#xff0c…

ccf历年第二题满分python代码及知识点总结(2013-2022)

201312-2ISBN号码 思路: 就是简单的字符串处理,没有什么好说的。 代码: str_input input() s str_input.replace("-", "") sum_value 0 start 1 for i in range(len(s)-1):sum_value int(s[i]) * startstart 1…

AI-多模态-2021:ALIGN【】

https://arxiv.org/abs/2102.05918 【写在前面】 学习良好的视觉和视觉语言表征对于解决计算机视觉问题(图像检索、图像分类、视频理解)是至关重要的,目前,预训练的特征在许多NLP任务中已经展现了非常大的潜力。虽然NLP中的表示学习已经可以用没有人工…

消息队列基础

消息队列的应用场景 异步处理,提升吞吐量 削峰填谷,平滑流量冲击 应用解耦,提升系统可用性 消息通讯,点对点消息通讯 消息模型 点对点模式 生产者生产消息到队列服务器,消费者消费消息,并发送确认收到…

Redis Cluster 扩容实战

Redis Cluster 扩容 接着上一篇Redis Cluster 单机集群部署,今天学习下Redis Cluster 架构在实际应用中如何面对各种复杂的场景,如: 扩容 - 增加节点缩减 - 删除节点宕机 - 主节点服务异常 增加节点 随着集群需求的变化,系统人…

smart-doc 文档生成器实战

文章目录一、部署二、代码演示1.类、方法注解2.执行、生成html 或 markdown文档三、参考文档一、部署 1.基于SprinBoot项目&#xff0c;加入pom.xml加入依赖<build><plugins><!-- 打包跳过测试 --><plugin><groupId>org.springframework.boot&l…