MySQL 条件查询 Emoji 表情符号却返回多条数据【包含其它表情符号】的问题解决 - COLLATION 字符序的选择

这篇具有很好参考价值的文章主要介绍了MySQL 条件查询 Emoji 表情符号却返回多条数据【包含其它表情符号】的问题解决 - COLLATION 字符序的选择。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、问题出现

    在APP客户端输入搜索文章的关键字时,不小心输入来了一个 emoji 表情符号,提示出错了,在后台查询错误日志信息,提示查询出现了2条相同的记录:

Caused by: org.hibernate.NonUniqueResultException: query did not return a unique result: 2

2、业务逻辑

    数据库有个 tb_search_statistic 表格用来记录用户的搜索记录。每次客户端发起搜索,后台业务先查询下之前是否已经存在该「关键字」的搜索记录,如果没有就插入一条新数据,如果已经存在就对其搜索次数增加 1; 在执行查询操作时,因为返回了两条记录所以报错了。

3、在Nacat for MySQL 进行问题重现

MySQL 条件查询 Emoji 表情符号却返回多条数据【包含其它表情符号】的问题解决 - COLLATION 字符序的选择,数据库,mysql,数据库

    果然,出现了两条记录,是不是很奇怪,明明两个表情符号是完全不同的。其实这条查询语句里面有个字符 “=” ,这个等号和 MySQL 的字符集和字符序有关系。

    MySQL 里存储的数据,只要是字符类型的字段,都会对应一个字符集(字符集合+编码)和字符序(字符的排序和比较),每个字符集对应一个或多个字符序,且对应一个默认的字符序,在数据表里新建字段时,这个字符集和字符序就确定下来了,如果不专门指定,就继承自表格的字符集和字符序(继承关系:服务器 <- 数据库 <- 表 <- 字段)。

    在 Navicat 客户端看下表格的字符集和字符序:

MySQL 条件查询 Emoji 表情符号却返回多条数据【包含其它表情符号】的问题解决 - COLLATION 字符序的选择,数据库,mysql,数据库

    可以发现,表格的字符集是 utf8mb4, 字符序是默认的 utf8mb4_general_ci。因为 keyword 字段没有专门指定,就继承了与表格相同的字符集和字符序。

    问题的关键就出在这里:utf8mb4_general_ci 无法精确区分不同的 emoji 表情符号,所以导致查询结果出现多条记录。刚才提到一个字符序可以对应多个字符序。下面是 utf8mb4 对应的的两个字符序的比较:

  • utf8mb4_bin:将字符串每个字符用二进制数据编译存储,区分大小写,而且可以存二进制的内容。
  • utf8mb4_general_ci:ci 即 case insensitive,不区分大小写。没有实现 Unicode 排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致。但是,在绝大多数情况下,这些特殊字符的顺序并不需要那么精确。
     

4、解决方案

    方案一:将字段的字符序修改为 utf8mb4_bin

MySQL 条件查询 Emoji 表情符号却返回多条数据【包含其它表情符号】的问题解决 - COLLATION 字符序的选择,数据库,mysql,数据库

     修改后,再次执行查询语句,结果就正好是我们期望的这条数据了:

MySQL 条件查询 Emoji 表情符号却返回多条数据【包含其它表情符号】的问题解决 - COLLATION 字符序的选择,数据库,mysql,数据库

 

    方案二:在where查询字段添加 binary 关键字,BINARY 不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串。

MySQL 条件查询 Emoji 表情符号却返回多条数据【包含其它表情符号】的问题解决 - COLLATION 字符序的选择,数据库,mysql,数据库

    以上出现了一些关于字符集和字符序的术语,其实 MySQL 的一些莫名其妙的错误包括“乱码”都和它们密切相关。 所以有必要对它们有清晰的了解,如果感兴趣,可以参考笔者另外一篇文章:

MySQL 字符集概念、原理及配置之图文详解文章来源地址https://www.toymoban.com/news/detail-669309.html

到了这里,关于MySQL 条件查询 Emoji 表情符号却返回多条数据【包含其它表情符号】的问题解决 - COLLATION 字符序的选择的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL 04-EMOJI 表情与 UTF8MB4 的故事

    MySQL View MySQL truncate table 与 delete 清空表的区别和坑 MySQL Ruler mysql 日常开发规范 MySQL datetime timestamp 以及如何自动更新,如何实现范围查询 MySQL 06 mysql 如何实现类似 oracle 的 merge into MySQL 05 MySQL入门教程(MySQL tutorial book) MySQL 04- EMOJI 表情与 UTF8MB4 的故事 MySQL Expression 1 of ORDE

    2024年04月12日
    浏览(37)
  • MySQL如何存储表情符号?

    默认mysql的字符集是utf8,排序规则为 utf8_general_ci 在存储表情的时候会报 1366 - Incorrect string value: \\\'xF0x9Fx98x84\\\' for column \\\'name\\\' at row 1, Time: 0.007000s 这时需要修改字符集 这时就可以了 utf8和utf8mb4的区别 MySQL中的utf8其实是utf8mb3,最多只用3个字节存储字符,存储不了表情。如果要

    2024年02月02日
    浏览(36)
  • HTML常用表情Emoji‍♂️和Emoji参考手册

    HTML表情可以用来在网页中插入各种表情符号图标,丰富了网页表现形式和视觉效果。下面是一些常用HTML表情代码大全📜 ⚽🐰🦋🌅💥🍐🍞🙇🏌 🐶🐔🍃 🌞🌈🙈🍀💜 🕊🐯🙋‍♂️ 🔥⏰🧧📢🐾🐠🥤🐌🙏💕😼🎈🍓💤🌟🐈🐝🌕💫🥫🌪💪🥛🎹🥦🐠🔒🍌

    2024年02月13日
    浏览(41)
  • MySQL数据库——MySQL WHERE:条件查询数据

    在 MySQL 中,如果需要有条件的从数据表中查询数据,可以使用 WHERE 来指定查询条件。 使用 WHERE 的语法格式如下: WHERE 查询条件 查询条件可以是: 带比较运算符和逻辑运算符的查询条件 带 BETWEEN AND 的查询条件 带 IS NULL 的查询条件 带 IN

    2024年02月03日
    浏览(58)
  • 数据库基础之 - MySQL条件查询

    从今天开始,本系列内容就带各位小伙伴学习数据库技术。 数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。 全文大约【 1263】 字,不说废话,只讲可以让你学到技术、

    2024年02月06日
    浏览(71)
  • Unity UGUI TextMeshPro实现输入中文和表情包(Emoji)表情

    目录 实现中文显示 准备工作 1、打开Window——TextMeshPro——FontAssetCreator 2、把字体文件放入SourceFont中 3、把CharacterSet改为Characters from File 4、把字体库文件放入Characters File 5、设置好参数点击Generate Font Atlas等待完成后保存 6、把生成后保存的字体文件退拽到Font Asset即可 效果演

    2024年01月18日
    浏览(40)
  • mysql数据库表的多条件查询

    select可以返回多条数据也可以返回一条数据 如果要查询所有的字段可以用 *****代替 where后面跟的是筛选条件(可选) N 是返回的数据条数(可选) M 是数据的偏移量(可选) 例如:在职位招聘表中获取在长沙雨花区的前10条信息 通用语法 : 询语句中你可以使用一个或者多个

    2024年02月11日
    浏览(64)
  • ChatGPT实现markdown 格式与 emoji 表情

    书写文章时,巧妙的使用一些小图标,可以给文章增加不少的灵动感,读者也会感觉更加轻松。恰当的图标也能增进读者对内容的理解。ChatGPT 目前不能直接联网,但可以使用 emoji 表情文字来达到类似的效果。我们在不少 GitHub 的项目介绍和个人介绍页面上,都可以看到在列

    2024年02月07日
    浏览(41)
  • Unity中使用TextMeshPro打出Emoji表情

    最近遇到一个需求,在聊天框中支持用户的Emoji输入,查了半天资料没有一个能说清楚的,于是自己研究琢磨了下。 最终效果 最终效果可以在APP输入框中使用系统的输入法输入emoji表情并显示,如下 1.1 准备好emoji素材 找到emoji图片,注意需要是 unicode.png 格式命名的。github上

    2024年01月18日
    浏览(52)
  • iOS开发-聊天emoji表情与自定义动图表情左右滑动控件

    iOS开发-聊天emoji表情与自定义动图表情左右滑动控件 之前开发中遇到需要实现聊天emoji表情与自定义动图表情左右滑动控件。使用UICollectionView实现。 UICollectionView是一种类似于UITableView但又比UITableView功能更强大、更灵活的视图,这是源于它将UICollectionView对cell的布局交给了

    2024年02月15日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包