✅生产问题之Emoji表情如何操作存储,MySQL是否支持

news2024/11/26 20:38:34

针对 Emoji 表情 MySQL 存储是否支持的问题,结论是:

MySQL 中可以存储 emoji 表情,但需要使用 UTF8MB4 字符编码。如果使用 UTF8MB3,存储这些扩展字符会导致解析错误。

课外补充

MySQL 对 Unicode 的支持

Unicode 字符集已成为计算机科学领域的业界标准,它整理、编码了世界上大部分的文字系统,使得计算机能够更简便地呈现和处理文字。

为了满足不同的数据存储和传递需求,人们开发了多种 Unicode Transformation Format(UTF)编码。主要的 UTF 编码包括 UTF-8、UTF-16 和 UTF-32 等。

根据 MySQL 官方文档

  • https://dev.mysql.com/doc/refman/8.0/en/charset-unicode.html

MySQL 主要支持以下字符集:utf8、ucs2、utf8mb3、utf8mb4、utf16、utf16le 和 utf32。这些字符集在支持的字符范围和存储空间需求上有所不同。

字符集支持的字符每个字符所需存储空间
utf8mb3, utf8BMP1-3 字节
ucs2BMP2 字节
utf8mb4BMP 和补充字符1-4 字节
utf16BMP 和补充字符2 或 4 字节
utf16leBMP 和补充字符2 或 4 字节
utf32BMP 和补充字符4 字节

在 MySQL 官方文档中,介绍了支持的编码方式之后,还有一段醒目的提醒:
image.png

以上文字大致意思是:“UTF8MB3 字符集已被弃用,它在未来的 MySQL 版本中将会被删除,请使用 UTF8MB4 代替。在目前的 8.0 版本中,utf8 指的就是 UTF8MB3,虽然未来可能改成 UTF8MB4,但是为了避免产生歧义,可以考虑为字符集引用显式指定 UTF8MB4,而不是 utf8。”

这段话的意思是,MySQL 8.0 版本中使用 UTF-8 字符编码实际上是使用了 utf8mb3 编码方式,但 UTF8MB3 已经被弃用,并且在未来的 MySQL 版本中会被移除。因此,建议在设定字符集时明确指定 UTF8MB4,以避免将来可能引起的歧义和问题。

现在我们来详细讨论 UTF8MB3 的情况。

UTF8MB3

utf8mb3 字符集是 MySQL 早期支持的一种字符集,具有以下特征:

  1. 仅支持 Basic Multilingual Plane(BMP)中的字符,不支持补充字符。
  2. 每个多字节字符最多需要三个字节来表示。

BMP 指的是基本多文种平面,其中的字符码位范围在 0 到 65535(或者用 Unicode 表示为 U+0000 到 U+FFFF)。这意味着 utf8mb3 无法存储码位在 U+10000 到 U+10FFFF 之间的补充字符,包括一些生僻的汉字和 Emoji 表情等。

因此,如果在创建 MySQL 表时使用 utf8mb3(即 utf-8)作为字符编码方式,就无法正确存储和处理补充字符。

UTF8MB4

早期的 Unicode 版本只使用了 0 到 0xFFFF 范围的编码,称为 BMP(Basic Multilingual Plane)字符集。因此,最初 MySQL 设计时只涵盖了支持 BMP 字符集的 utf8mb3(即 utf-8)。随着需求增加,包含在 Unicode 标准中的字符数量也增加了。

因此,早期的 utf8mb3 在某些情况下无法满足需求,特别是随着 Unicode 标准支持更多字符时,三个字节的编码空间变得不足以覆盖所有字符。

为了解决这个问题,MySQL 在 5.5.3 版本之后引入了 utf8mb4 字符集。

utf8mb4 字符集具有以下特点:

  1. 支持 BMP 和补充字符,即能够表示从 0 到 0x10FFFF 的所有 Unicode 字符。
  2. 每个多字节字符最多需要四个字节来编码。

utf8mb4 与 utf8mb3 字符集不同的地方在于,utf8mb3 仅能表示 BMP 字符,而 utf8mb4 则能够处理补充字符。对于 BMP 字符,utf8mb4 和 utf8mb3 的存储方式相同,但对于补充字符,utf8mb4 需要四个字节来存储,而 utf8mb3 则无法处理这些字符。

因此,为了确保能够存储和处理 Unicode 标准中的所有字符,特别是包括 Emoji 表情在内的补充字符,建议在创建 MySQL 表时使用 utf8mb4 字符集,而不是 utf8。

UTF8MB3 和 UTF8MB4 区别及优缺点

前面已经分别介绍了 utf8mb3 和 utf8mb4 字符集,它们的区别总结如下:

  • utf8mb3 只支持 BMP(Basic Multilingual Plane)中的字符,而 utf8mb4 则支持 BMP 以及补充字符。
  • 每个字符在 utf8mb3 中最多使用 3 个字节来编码,而在 utf8mb4 中最多使用 4 个字节。
  • utf8mb4 能够表示更多的补充字符,但因为每个字符可能使用更多的字节,所以在存储空间上可能会比 utf8mb3 占用更大。

总之,utf8mb4 相比 utf8mb3 提供了更广泛的字符支持,尤其是对于包含 Emoji 表情在内的补充字符,但这也可能导致数据存储时占用更多的空间。

从 utf8mb3 转换成 utf8mb4

首先,将字符集从 utf8mb3 转换到 utf8mb4 其实并不困难:

对于 BMP 字符,utf8mb4 和 utf8mb3 具有相同的存储特性:相同的编码值、相同的编码方式以及相同的长度。

对于补充字符,utf8mb4 需要使用 4 个字节进行存储,而 utf8mb3 则无法存储这些字符。当将使用 utf8mb3 的列转换为 utf8mb4 时,您无需担心补充字符的转换问题,因为 utf8mb3 根本不支持补充字符。

假设已有一张表使用了 utf8mb3 字符集:


CREATE TABLE t1 (
  col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  col2 CHAR(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
) CHARACTER SET utf8;

下面的语句将 t1 转换为 utf8mb4:

ALTER TABLE t1
  DEFAULT CHARACTER SET utf8mb4,
  MODIFY col1 CHAR(10)
    CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  MODIFY col2 CHAR(10)
    CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL;

如有问题,欢迎微信搜索【码上遇见你】。

免费的Chat GPT可微信搜索【AI贝塔】进行体验,无限使用。

好了,本章节到此告一段落。希望对你有所帮助,祝学习顺利。

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

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

相关文章

整合第三方技术-整合JUnit

黑马程序员Spring Boot2 文章目录 名称:SpringBootTest类型:测试类注解位置:测试类定义上方作用:设置JUnit加载的SpringBoot启动类范例:

Stable-Baseline3 x SwanLab:可视化强化学习训练

Stable Baselines3 (SB3) 是一个强化学习的开源库,基于 PyTorch 框架构建。它是 Stable Baselines 项目的继任者,旨在提供一组可靠且经过良好测试的RL算法实现,便于研究和应用。StableBaseline3主要被应用于机器人控制、游戏AI、自动驾驶、金…

[面试题]Spring

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis Spring 是一个很庞大的技术体系,可以说包容一切&…

【PL理论】(22) 函数式语言:多参数 | 柯里化 (Currying) : 将多参数函数实现为返回一个函数的函数

💭 写在前面:本章我们将继续讲解函数式语言,介绍多参数,着重讲解柯里化的概念,将多参数函数实现为返回一个函数的函数。目录 0x00 多参数(Multiple Arguments) 0x01 柯里化(Currying) 0x00 多参数(Multiple Arguments) 我们可以定义一个带有多个参数的函数吗?比…

计算机组成原理之存储器(一)

文章目录 存储器概述存储器的分类情况按照存储器在系统中的作用分类按存储介质分类按存取方式分类 主存储器的技术指标 存储器概述 程序的局部性原理(构成多级存储系统的依据):在某一个时间段你频繁访问某一局部的存储器地址空间,…

短剧系统搭建全攻略:功能齐全,一步到位

前言 近年来,短剧系统以其独特魅力,成为大众消遣娱乐的热门选择。简单来说,短剧系统就是用来看短剧的小程序,它汇集了丰富多彩的短剧资源,让观众随时随地享受观影乐趣。本文将为你详细解析短剧系统的搭建全攻略&#…

web前端之vue一键部署的shell脚本和它的点.bat文件、海螺AI、ChatGPT

MENU 前言vite.config.ts的配置deploy文件夹的其他内容remote.shpwd.txtdeploy.bat 前言 1、在src同级新建deploy.bat文件; 2、在src同级新建deploy文件夹,文件夹中新建pwd.txt和remote.sh文件; 3、配置好后,直接双击deploy.bat文…

生成式人工智能备案办理指南,深度解析大模型备案全流程

早在2023年年初,国家互联网信息办公室、工业和信息化部、公安部针对深度合成服务制定的《互联网信息服务深度合成管理规定》(“《深度合成管理规定》”)顺利施行,其明确了深度合成服务相关方的义务与主体责任,强化了对…

分数布朗运动FBM期权定价模型

BS定价模型和蒙特卡洛模拟期权定价方法都 假设标的资产价格的对数服从布朗运动 . 但是实际 的金融市场中标的资产价格运动过程具有 “尖峰厚尾 ” 现象 , 运用分数布朗运动 (FBM )来刻画标的资产 价格的运动过程可能更加合适。 …

基于OCC+OSG的读取IGS模型显示其装配以及模型颜色

一般来说,读取STP模型会解析其装配结构,而读取IGS模型时候一般不这么做,因为IGS的每个部件大多是面片,而非一个实体模型,所以比如一些开源软件,比如Freecad等都是直接将模型作为一个整体并且在模型树上只显…

HandyControl 使用内置Command 执行无效问题

HandyControl 中通过查阅代码HandyControl_Shared 共享项目中,Interactivity/Commands 目录下,存在着一些内置 Command,开心发现还有关闭窗体,最小化等系统级别常用命令。 CloseWindowCommand.cs ControlCommands.cs OpenLinkCom…

接口自动化测试实战:测试用例也能自动生成

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 作为测试,你可能会对以下场景感到似曾相识:开发改好的 BUG 反复横跳&…

2024年6月17日 (周一) 叶子游戏新闻

期刊杂志: 聚合读者、意林、知音、故事会、花火以及国内各大知名报纸电子版,无需付费即可观看各种免费资源 中医自学宝典: 集合了中医医案,医经,方剂 药材知识的app,更方便的免费学习中医知识 《最终幻想7》重制三部曲总监鸟山求&…

AI导航网

文章目录 1、[AI导航网](https://www.ainav.cn/) 1、AI导航网 https://www.ainav.cn/

云顶森林的新守护者:大数据平台的智慧力量

在遥远的云顶之上,有一片生机盎然的森林,它不仅是动植物的家园,更是自然与人类和谐共生的典范。然而,如何在这片广袤的森林中实施高效、科学的管理,一直是一个摆在管理者面前的难题。幸运的是,随着科技的飞…

linux 安装 Nginx 并部署 vue 项目

1、安装 yum install nginx2、使用 nginx 命令 查看nginx状态 systemctl status nginx 启动服务 systemctl start nginx停止服务 systemctl stop nginx重启服务 systemctl restart nginx修改配置后重载 systemctl reload nginx 加入开机自启动 systemctl enable ngin…

Qt中利用QTextBrowser控件设计日志窗口

我们一般使用Qt开发应用程序时,都有将控制台窗口去掉。但是,有时候又需要查看一些调试信息,一般的处理方式是把log写到一个文件中。本文介绍以下日志窗口,可以更方便的查看日志信息。 UI设计 推拽UI控件,修改默认背景…

数字孪生定义及应用介绍

数字孪生定义及应用介绍 1 数字孪生(Digital Twin, DT)概述1.1 定义1.2 功能1.3 使用场景1.4 数字孪生三步走1.4.1 数字模型1.4.2 数字影子1.4.3 数字孪生 数字孪生地球平台Earth-2 参考 1 数字孪生(Digital Twin, DT)概述 数字孪…

Linux系统OpenSSH_9.7p1升级详细步骤

版本说明 当前内核版本如下 当前操作系统版本如下 当前OpenSSH版本和OpenSSL版本如下 升级说明 openssh依赖于openssl和zlib,而openssl依赖于zlib,所以我们要先安装zlib,然后是openssl,最后是openssh。zlib-1.3.1下载地址&#…

新版嘎嘎快充互联互通系统配置文档

宝塔环境配置 登录宝塔账号,安装nginx、mysql5.7、php7.2、supervisor、redisphp安装扩展: 1)安装swooleloader72 将嘎嘎官方提供的swoole_loader_72_nts.so文件上传到 /www/server/php/72/lib/php/extensions/no-debug-non-zts-20170718…