👨‍💻如何使用MySQL存储Emoji表情,UTF-8和UTF-8MB4字符编码有何区别?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 👨‍💻如何使用MySQL存储Emoji表情,UTF-8和UTF-8MB4字符编码有何区别?


终于开始动工这最后一篇小知识的文章啦。

一直都没想到写什么比较合适,就要继续准备肝11月的更文了,太卷了吧👨‍💻

🏆前言

这篇应该算个小知识吧。平时习惯在写文章的时候都喜欢用 windowsemoji表情(win+.)即可弹出,就如👨‍💻🏂🛌🛀🤽‍♂️⛹️‍♂️🤸‍♂️,还有、🏎🚠🛫💺🚀🛰⛵,这种🍟🍔🍿🌭🥞🥙🍰🥤🍸

之前开发的项目,没有存储过这种小表情,都是使用mysql的默认字符设置UTF-8,但是今天测试发现是行不通,从而就有了这篇小文章啦,希望能够让你有所收获。

📚一、UTF-8 为什么不支持Emoji表情

在一个utf-8表中所做测试,不支持插入数据中包含emoji表情的数据。

1704462708108.jpg

原因:MySQL数据库的 “utf8”并不是真正概念里的 UTF-8。目前可见字符集都只需要3个字节,包含了所有字符。但是问题出在unicode6系列编码上,它们需要4个字节,这部分就是有名的emoji。所以,如果我们的数据库使用默认字符设置,是无法存储emoji表情的。

📑二、UTF-8 与 UTF-8MB4 的区别

2.1、UTF-8 (Unicode)

我们先谈谈UTF-8,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。

因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。现代操作系统和大多数编程语言都直接支持Unicode。

所以在UTF-8编码中,一个英文字符占用一个字节的存储空间,一个中文(含繁体)占用三个字节的存储空间。

目前基本上可见字符集都只需要三个字节,包含了所有字符,但是目前问题出在了unicode6系列编码上,它们需要4个字节,这部分就是有名的emoji。所以,你只要不是特种编码还是unicode,且不存emoji,保证不出问题。

另外在此处,我有一点需要补充的是:

MySQL数据库的 “utf8”并不是真正概念里的 UTF-8,原因上面是一点,还有一点是MySQL中的“utf8”编码只支持最大3字节每字符。真正的大家正在使用的UTF-8编码是应该能支持4字节每个字符。

但其实MYSQL的开发者,并没有修饰这个bug,而是推出了新的字符集,就是UTF-8MB4字符编码。👇

2.2、UTF-8MB4

UTF8MB4:MySQL在5.5.3之后增加了utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。因此可以用来存储emoji表情。

从8.0后,MySQL也将会在某个版本中开始使用UTF-8MB4作为默认的字符编码。

所以简单说即是:UTF-8MB4才是MySQL中真正的UTF-8编码

那么如何让MySQL存储Emoji表情勒。

📰三、如何让MySQL存储Emoji表情

我们在创建数据库的时候,就需要选定utf-8mb4字符集,而不是utf-8。

1704462721066.jpg

我们在设置字段字符集的时候,也需要设置为utf-8mb4字符集。

1704462728102.jpg

这样我在Navicat 中测试是可以的。

1704462730385.jpg

但是,我之前在网上查询相关资料的时候,说是需要修改一下my.ini配置文件,

[mysqld]下面添加:character_set_server=utf8mb4,保存,重启mysql,应该就可以解决了。

⌛四、自言自语

注意下次再有人问起设置什么样的编码,记得直接推荐设置utf-8mb4哦,这个才是MySQL真正的UTF-8编码哦。

开始想11月更文写什么,掘金大佬们,你说我现在开始学前端还有救吗。

大家也可以说说想看什么,我会就写写会,不会就去学学,给大家推推文。👨‍💻

咱们后端这阶段真的是处于一个是人是鬼都在卷的时期,困难重重啊

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
22天前
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志和二进制日志是确保数据库稳定性和可靠性的关键组件。重做日志主要用于事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务;而二进制日志记录SQL语句的逻辑变化,支持数据复制、恢复和审计。两者在写入时机、存储方式及配置参数等方面存在显著差异。
|
2月前
|
存储 自然语言处理 关系型数据库
MySQL 自定义变量并声明字符编码
MySQL 自定义变量并声明字符编码
140 1
|
2月前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
3天前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
23天前
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
52 9
|
1月前
|
存储 NoSQL 关系型数据库
MySQL和Redis的区别
**MySQL和Redis的区别** MySQL和Redis都是流行的数据存储解决方案,但它们在设计、用途和特性上有显著区别。理解这些区别有助于选择合适的数据库来满足不同的应用需求。本文将详细介绍MySQL和Redis的区别,包括它们的架构、使用场景、性能和其他关键特性。 ### 一、基本概述 **MySQL**: MySQL是一个关系型数据库管理系统(RDBMS),使用结构化查询语言(SQL)进行数据管理。它支持事务、复杂查询和多种存储引擎,广泛应用于各种Web应用、企业系统和数据分析项目。 **Redis**: Redis是一个基于内存的键值数据库,通常被称为NoSQL数
104 4
|
1月前
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志(Redo Log)和二进制日志(Binary Log)是两种重要的日志系统。重做日志主要用于保证事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务更改。二进制日志则记录了数据库的所有逻辑变化操作,用于数据的复制、恢复和审计。两者在写入时机、存储方式、配置参数和使用范围上有所不同,共同确保了数据库的稳定性和可靠性。
|
2月前
|
存储 关系型数据库 MySQL
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
PACS系统 中 dicom 文件在mysql 8.0 数据库中的 存储和读取(pydicom 库使用)
45 2
|
2月前
|
存储 SQL 关系型数据库
MySQL 存储函数及调用
MySQL 存储函数及调用
211 3
|
2月前
|
存储 SQL 关系型数据库
mysql中主键索引和联合索引的原理与区别
本文详细介绍了MySQL中的主键索引和联合索引原理及其区别。主键索引按主键值排序,叶节点仅存储数据区,而索引页则存储索引和指向数据域的指针。联合索引由多个字段组成,遵循最左前缀原则,可提高查询效率。文章还探讨了索引扫描原理、索引失效情况及设计原则,并对比了InnoDB与MyISAM存储引擎中聚簇索引和非聚簇索引的特点。对于优化MySQL性能具有参考价值。