浅谈uf8mb4字符集

article/2025/8/31 2:37:16

要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集(mb4就是most bytes 4的意思,专门用来兼容四字节的unicode),但只有 5.5.3 版本以后的才支持。
为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8. 对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR 替代 CHAR。其实,utf8mb4是utf8的超集,理论上原来使用utf8,然后将字符集修改为utf8mb4,也会不会对已有的utf8编码读取产生任何问题。当然,为了节省空间一般情况下使用utf8也就够了!转换是否有影响

MySQL 可以设置数据库级别,表级别,列级别 字符集编码

优先级顺序为:数据库字符集 < 表字符集 < 列字符集
也就是 上面三个级别 字符集不一致时,以 更小范围的配置 为准;

例如:数据库字符集为utf8,表字符集不设置的情况下会默认utf8。如果表主动设置了编码 utf8mb4,那么表的字符集编码就为utf8mb4。

MySQL数据库的"utf8"并不是真正概念里的UTF-8

转载链接
MySQL中的“utf8”编码只支持最大3字节每字符。真正的大家正在使用的UTF-8编码是应该能支持4字节每个字符。
MySQL的开发者没有修复这个bug。他们在2010年增加了一个变通的方法:一个新的字符集“utf8mb4”
当然,他们并没有对外公布(可能因为这个bug有点尴尬)。现在很多指南推荐用户使用“utf8”其实都错了!
简单的说:
MySQL中的 “utf8mb4” 才是 真正意义上的“UTF-8”。
MySQL的utf8是个“特殊的字符编码”。这种编码很多Unicode字符保存不了。

建议MySQL和MariaDB用户使用“utf8mb4”而不是“utf8”。

编码是什么?什么是UTF-8?
计算机使用0和1存储文字。比如第一段第一个字符存储为“01000011”表示“C”,计算机通过以下两个步骤选择用“C”表示:
计算机读取到“01000011”后计算出这是数字67。
计算机通过查找Unicode字符集来确认67代表的“C”。
同样的事情发生在我打字输入C的时候。
计算机通过Unicode字符集将“C” 映射为67。
计算机把67编码为“01000011”发送给web服务器。
几乎所有的程序和互联网应用使用Unicode字符集。
Unicode字符集里有超过100万个字符(“C” 和 “❤” 是两种不同的字符)。UTF-32是最简单的编码方式,它在表示每个字符的时候使用32个bits。这样编码简单,但是并不实用,明显浪费了太多的空间。

UTF-8相比UTF-32更加节约空间。在UTF-8中,像“C”这样的字符占用8bits,“❤”这样的占用32 bits。其他字符占用16或者24 bits。用UTF-8存储比用UTF-32节省4倍左右的空间。更小的空间占用也意味着加载速度会快上4倍。

而MySQL中的 “utf8”字符集则和其他应用行为不一样。比如根本没法表示“❤”。
MySQL从4.1版开始支持UTF-8。那是在比今天UTF-8 RFC 3629标准更早的2003年。

在此之前的UTF-8标准,RFC 2279中规定6个bytes表示一个字符。MySQL的开发者在2002.3.28编码实现了RFC 2279 。并发布了pre-pre-release 的 MySQL 4.1,然后在9月出现了一个神秘的字节调整。“UTF8 now works with up to3 byte sequences only.”

回到2002年,如果用户可以保证表中的每一行具有相同的字节数,MySQL就可以提高用户的速度。为了得到这个提升,用户就需要定义保存文字的列为“CHAR”。一个“CHAR”列总是拥有相同的字符数。如果存入的字符较少则会在最后补齐空白。如果存入的数据过多则会被抛弃多余的字符。

当MySQL的开发者第一次尝试以6字节每字符实现UTF-8时,他们意识到CHAR(1)的列会占用6字节,CHAR(2)会占用12字节,以此类推。
显而易见的是,这个没有被使用的实现方式是正确的,任何一个理解UTF-8的开发者将会认同这一点。

我的猜测是:MySQL的开发者违背了“utf8”编码去帮助那些1)试图去优化空间和速度的人,2)尝试优化空间和速度失败的人。

这是个无人获益的改动。那些想要更快性能,更小空间的得到的依然是比他们曾经使用版本更大更慢的实现,而那些想要正确的“utf8”的人得到的是个“❤”都存储不了的实现。

MySQL发布了这个错误的版本后,在也没有修复它:因为那样很多使用者将被迫重建他们的数据库。MySQL最终在2010年更新了一个以“utf8mb4”命名的UTF-8实现。
如果你使用MySQL或者 MariaDB,不要使用“utf8”,应该总是使用“utf8mb4”,否则总有一天会遇到头疼的事情。

字节和字符

varchar(255)所表示的单位是字符,而一个汉字一个字母都是一字符。所以这里可以存储255个汉字或者255个字母。

utf-81字符=3字节。	(uft-8也称之为utf-8mb3)
utf-8mb4下	1字符=4字节。

存储上限

varchar的存储上限是65535字节

utf-8      varchar(21845)是上限(65535/3)
utf-8mb4   varchar(16383)是上限(65535/4)

表情☺️

一个表情是占用4个字节,所以utf-8下,表情会乱码,1字符装不下,需要额外的空间。
utf-8mb4下,一个表情正好是一字符,能够完美显示。
varchar(255) 即表示能存放255个汉字,或255个字母,或255个表情。

为什么要使用utf8mb4字符集

低版本的MySQL支持的utf8编码,最大字符长度为 3 字节,如果遇到 4 字节的字符就会出现错误了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。也就是说,任何不在基本多文平面的 Unicode字符,都无法使用MySQL原有的 utf8 字符集存储。这些不在BMP中的字符包括哪些呢?最常见的就是Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上)和一些不常用的汉字,以及任何新增的 Unicode 字符等等。
那么utf8mb4比utf8多了什么的呢?
✔ 多了emoji编码支持
如果实际用途上来看,可以给要用到emoji的库或者说表,设置utf8mb4,比如评论要支持emoji可以用到。

新建mysql库的排序规则

utf8_unicode_ci比较准确,utf8_general_ci速度比较快。通常情况下 utf8_general_ci的准确性就够我们用的了。
如果是utf8mb4那么对应的就是 utf8mb4_general_ci utf8mb4_unicode_ci

在这里插入图片描述

索引长度限制

1、对于 myisam 引擎, utf8mb4字符的字段, 允许单索引字段的最大字节为1000, 即最大允许 1000/4=250 个字符, varchar(255)。
2、对于 innodb 引擎, utf8mb4字符的字段, 允许单索引字段的最大字节为765, 即最大允许 765/4=191 个字符, varchar(191)。
如果有启用 innodb_large_prefix 选项,设置 mysql innodb_large_prefix=on, 可将允许索引字段的最大字节约束项扩展至 3072 字节, 即最大允许 3072/4=768个字符, varchar(768)。具体可查阅《mysql 索引长度限制》
You must be more handsome when you work hard!


http://chatgpt.dhexx.cn/article/wHymsJUN.shtml

相关文章

学习笔记4-K均值聚类算法

K-均值聚类的一般流程 &#xff08;1&#xff09;收集数据&#xff1a;可以使用任何方法收集数据 &#xff08;2&#xff09;准备数据&#xff1a;需要数值型数据来计算距离&#xff0c;也可以将标称型数据映射为二值型数据再用于距离计算 &#xff08;3&#xff09;分析数据…

【吴恩达机器学习-笔记整理】k-means(k-均值聚类算法)

目录&#xff1a; &#x1f335;&#x1f335;&#x1f335;前言一、应用二、k-means1、参数&#xff1a;2、过程3、应用4、优化目标5、随机初始化6、聚类数量的选择 ❤️❤️❤️忙碌的敲代码也不要忘了浪漫鸭&#xff01; &#x1f335;&#x1f335;&#x1f335;前言 ✨你好…

25.K-均值算法的介绍及实现过程

主要内容 K-均值算法的介绍K-均值算法的实现过程K-均值算法的具体例子实现过程 一、K-均值算法的介绍 K-均值&#xff08;K- means&#xff09; ** 是最普及的聚类算法**&#xff0c;算法接受一个未标记的数据集&#xff0c;然后将数据聚类成不同的组 聚类算法 是无监督学习…

K-means(K均值聚类算法)算法笔记

K-means&#xff08;K均值聚类算法&#xff09;算法笔记 K-means 算法&#xff0c;是比较简单的无监督的算法&#xff0c;通过设定好初始的类别k&#xff0c;然后不断循环迭代&#xff0c;将给定的数据自动分为K个类别。事实上&#xff0c;大家都知道K-means是怎么算的&#x…

K-近邻算法讲解以及实战

1.概述 邻近算法&#xff0c;或者说K最近邻(KNN&#xff0c;K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻&#xff0c;就是k个最近的邻居的意思&#xff0c;说的是每个样本都可以用它最接近的k个邻居来代表。Cover和Hart在1968年提出了最初的…

第十五课.K均值算法

目录 K均值算法原理K均值算法的改进&#xff1a;K-meansnumpy实现K-means K均值算法原理 K均值&#xff08;K-means&#xff09;算法属于无监督学习中的聚类算法&#xff1b;聚类是根据样本特征向量之间的相似度或距离&#xff0c;将样本数据划分为若干个样本子集&#xff0c;…

K均值与K近邻算法简析

回顾了一下机器学习的简单算法。 原文链接&#xff1a;https://blog.csdn.net/zll0927/article/details/17000675 K-Means介绍 K-means算法是聚类分析中使用最广泛的算法之一。它把n个对象根据他们的属性分为k个聚类以便使得所获得的聚类满足&#xff1a;同一聚类中的对象相似度…

聚类算法、无监督学习、K均值算法及其优化函数

聚类算法 无监督学习&#xff1a;将无标签样本分为不同的两类或者多类&#xff0c;称为聚类算法 K均值算法 K均值算法是一个迭代算法&#xff0c;共两个步骤 1.簇分配&#xff1a;遍历图中每个样本&#xff0c;根据每个样本点离那个聚类中心近&#xff0c;从而将该样本点分配…

K-means算法-综合整理

A 主要流程 a 随机初始化k个点作为簇质心 b 计算每个点与质心距离&#xff08;常用欧式距离和余弦距离&#xff09;&#xff0c;并将其分配给最近 的质心对应的簇中 c 重新计算每个簇的质心&#xff0c;更新为所有点的平均值 d 反复迭代b-c步骤&#xff0c;直到达到某个终止条…

K均值聚类算法(Kmeans)讲解及源码实现

K均值聚类算法(Kmeans)讲解及源码实现 算法核心 K均值聚类的核心目标是将给定的数据集划分成K个簇&#xff0c;并给出每个数据对应的簇中心点。算法的具体步骤描述如下。 数据预处理&#xff0c;如归一化、离群点处理等。随机选取K个簇中心&#xff0c;记为 μ 1 ( 0 ) , μ 2…

K-means算法详解及实现

文章目录 一、原理和流程1、原理2、流程 二、K-means中常用的到中心距离的度量有哪些三、K-means中的k值如何选取1、手肘法2、轮廓系数法3、总结 四、代码实现五、其他问题的解答References 主要的KMeans算法的原理和应用&#xff0c;在学习典过程中&#xff0c;我们要带着以下…

K-近邻算法全面解析

1 K-近邻算法简介 K-近邻(K-Nearest Neighbor&#xff0c;KNN)&#xff0c;采用的是测量不同特征值之间距离的方法进行分类。对当前待分类样本的分类&#xff0c;需要大量已知分类的样本的支持&#xff0c;因此KNN是一种有监督学习算法。 2 K-近邻算法的三要素 距离度量、K…

k-means clustering algorithm,K均值算法

k-means clustering algorithm K均值聚类算法&#xff1a;需要分成K类&#xff0c;K是需要自己指定的 举例&#xff1a; 指定K&#xff0c;需要分成K类。 此例中&#xff1a;K为2选取K个点作为聚类中心 &#xff0c;一般的&#xff0c;K为已有的点。 此例子&#xff1a;中为…

K-means算法手动实现

1. K-means算法 k均值聚类算法&#xff08;k-means clustering algorithm&#xff09;是一种迭代求解的聚类分析算法&#xff0c;其步骤是&#xff0c;预将数据分为K组&#xff0c;则随机选取K个对象作为初始的聚类中心&#xff0c;然后计算每个对象与各个种子聚类中心之间的距…

k-means聚类算法原理与参数调优详解

https://www.toutiao.com/a6690435044869145101/ k-means算法原理 K-means中心思想&#xff1a;事先确定常数K&#xff0c;常数K意味着最终的聚类类别数&#xff0c;首先随机选定初始点为质心&#xff0c;并通过计算每一个样本与质心之间的相似度(这里为欧式距离)&#xff0c;…

kmeans算法及其改进算法K-means++,ISODATA和Kernel K-means

首先需要明确的是上述四种算法都属于"硬聚类”算法&#xff0c;即数据集中每一个样本都是被100%确定得分到某一个类别中。与之相对的"软聚类”可以理解为每个样本是以一定的概率被分到某一个类别中。 先简要阐述下上述四种算法之间的关系&#xff0c;已经了解过经典…

【算法】一个简单的k均值(k-means)原理

基本思想 通过迭代寻找k个聚类的一种划分方案&#xff0c;使用这k个聚类的均值来代表相应各类样本时所得到的总体误差最小。 一旦给定了类别数目k&#xff0c;k均值就按照平方误差和最小的原则将所有样本划分到指定数目的类中。 k均值&#xff08;k-means&#xff09;有时也…

K-均值算法简介

前段时间把en.wikipedia.org里关于K-means clustering算法的条目翻译了一下&#xff0c;搬到了zh.wikipedia.org里的条目“K-平均算法”下。 后来组内讨论的时候又重新整理了一下要用的内容&#xff0c;放到博客上来吧。 因为打算写一篇K-均值算法下自学习距离度量(distance …

KMean算法精讲

本文目录 基本训练步骤关于KMeans的几个问题KMeans算法的目标函数是什么&#xff1f;KMeans算法是否一定会收敛&#xff1f;不同的初始化是否带来不⼀样的结果&#xff1f;K值如何进行选择&#xff1f; KMeansKMeans的优缺点个人有关KMeans的奇思妙想 KMeas算法是一种聚类算法&…

K-Means算法的并行和分布式写法

前段时间学习了并行与分布式技术&#xff0c;为了写了篇关于KMeans算法的并行和分布式的编程写法&#xff0c;上网找了挺久&#xff0c;没想到网上并没有很多资料&#xff0c;那今天就来说一下我是怎么写的吧。 首先来讲一下K-Means的思想原理吧&#xff01; K-Means算法思想…