返回顶部
首页 > 资讯 > 数据库 >浅谈uf8mb4字符集
  • 551
分享到

浅谈uf8mb4字符集

mysql数据库mariadbsqldatabase 2023-09-06 09:09:57 551人浏览 泡泡鱼
摘要

要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集(mb4就是most bytes 4的意思,专门用来兼容四字节的unicode),但只有 5.5.3 版本以

要在 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 编码,常见于 iOSAndroid 手机上)和一些不常用的汉字,以及任何新增的 Unicode 字符等等。
那么utf8mb4比utf8多了什么的呢?
✔ 多了emoji编码支持
如果实际用途上来看,可以给要用到emoji的库或者说表,设置utf8mb4,比如评论要支持emoji可以用到。

新建mysql库的排序规则

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

在这里插入图片描述

索引长度限制

对于 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!

来源地址:https://blog.csdn.net/qq_50573146/article/details/125177260

您可能感兴趣的文档:

--结束END--

本文标题: 浅谈uf8mb4字符集

本文链接: https://lsjlt.com/news/396795.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅谈uf8mb4字符集
    要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集(mb4就是most bytes 4的意思,专门用来兼容四字节的unicode),但只有 5.5.3 版本以...
    99+
    2023-09-06
    mysql 数据库 mariadb sql database
  • 浅谈缓冲字符流 BufferedReader BufferedWriter用法
    缓冲字符流BufferedReader和BufferedWriter 问题: 之前的文件读写都是按照字节、字符或者数组来实现的,对于文本文件而言,能否按照行,一行行读写呢。 提供了B...
    99+
    2024-04-02
  • MySQL数据类型之浅谈字符串(string)
    目录字符类型(CHAR Types)可变字符类型(Varchar Types)二进制类型(BINARY Types)可变二进制类型(VARBINARY Types)二进制大对象类型(BLOB Types)文本类型(Tex...
    99+
    2024-04-02
  • 浅谈python字符串方法的简单使用
    学习python字符串方法的使用,对书中列举的每种方法都做一个试用,将结果记录,方便以后查询。 (1) s.capitalize() ;功能:返回字符串的的副本,并将首字母大写。使用如下: >&g...
    99+
    2022-06-04
    浅谈 字符串 简单
  • 浅谈Python 字符串格式化输出(format/printf)
    Python 字符串格式化使用 "字符 %格式1 %格式2 字符"%(变量1,变量2),%格式表示接受变量的类型。简单的使用例子如下: # 例:字符串格式化 Name = '17jo' print 'w...
    99+
    2022-06-04
    浅谈 字符串 printf
  • 浅谈Java字符串比较的三种方法
    目录java字符串如何进行比较?1.通过使用 equals() 方法2.通过使用 == 运算符3.通过使用 compareTo() 方法java字符串如何进行比较? 我们可以根据内容...
    99+
    2023-05-14
    Java字符串 Java字符串比较
  • 浅谈java中字符串数组、字符串、整形之间的转换
    字符串数组转字符串(只能通过for循环):String[] str = {"abc", "bcd", "def"};StringBuffer sB = new StringBuffer();for (int i = 0; i < st...
    99+
    2023-05-30
    java 数组转换成字符串 ava
  • Python入门_浅谈字符串的分片与索引、字符串的方法
    这篇文章主要介绍了字符串的分片与索引、字符串的方法。 字符串的分片与索引: 字符串可以用过string[X]来分片与索引。分片,简言之,就是从字符串总拿出一部分,储存在另一个地方。 看下面这个例子,stri...
    99+
    2022-06-04
    字符串 浅谈 索引
  • JAVA 十六进制与字符串的转换浅谈
      笔者前几日在开服过程中需要将字符串转化成为16进制的字符串,在网上找到了一些方法尝试之后,均发现存在一个问题-->字符串转为16进制后再转回来,英文正常,中文出现乱码 笔者前几日在开服过程中需要将字符串转化成为16进制的字符串,在网...
    99+
    2023-09-27
    java 开发语言 算法
  • 浅谈python中的占位符
    占位符,顾名思义就是插在输出里站位的符号。我们可以把它理解成我们预定饭店。当我们告诉饭店的时候,饭店的系统里会有我们的预定位置。虽然我们现在没有去但是后来的顾客就排在我们后面。 常见的占位符有三种:   1...
    99+
    2022-06-04
    浅谈 python
  • 浅谈AndroidANR的信息收集过程
    目录一. ANR场景二. appNotResponding处理流程三. 总结一. ANR场景 无论是四大组件或者进程等只要发生ANR,最终都会调用AMS.appNotRespondi...
    99+
    2024-04-02
  • 浅谈Python中chr、unichr、ord字符函数之间的对比
    ord是unicode ordinal的缩写,即编号 chr是character的缩写,即字符 ord和chr是互相对应转换的. 但是由于chr局限于ascii,长度只有256,于是又多了个un...
    99+
    2022-06-04
    浅谈 函数 字符
  • 浅谈Rust += 运算符与 MIR 应用
    目录赋值表达式的求值顺序MIR单一实现下的强转两阶段借用的参与+= 运算符与 MIR 应用 本文 += 运算符部分整理自 Why does += require manual der...
    99+
    2023-01-31
    Rust += 运算符 Rust MIR 应用 Rust 运算符
  • MySQL--字符编码和字符集
    前言: 一般来说,出现中文乱码,都是客户端和服务端字符集不匹配导致的原因。(默认未指定字符集创建的数据库表,都是latinl字符集, 强烈建议使用utf8字符集)  保证不出现乱码的思想:保证客户端、服务端...
    99+
    2024-04-02
  • 浅谈Python处理json字符串为什么不建议使用eval()
    目录一、前言二、Json.loads与eval 性能对比1. eval2. json.loads一、前言 最近发现一些小伙伴使用eval来处理json,而且为了能够将json成功转...
    99+
    2024-04-02
  • 将sybase的字符集改回默认的字符集
    查看客户端字符集:在isql环境中执行:1> select @@client_csname2> go修改服务端字符集方法:假设sybase安装目录为$sybase$◆1.转到$syba...
    99+
    2024-04-02
  • MySQL的字符集
    #1, 字符集相关的参数名和概念   MySQL的字符集设置比较自由。可以设置很多种组合,相关的变量和参数有:      (root@localhost)[sample3]> show global ...
    99+
    2024-04-02
  • 浅谈typescript中keyof与typeof操作符用法
    目录一、keyof 简介二、keyof 的作用三、keyof 与对象的数值属性四、keyof 与 typeof 操作符一、keyof 简介 TypeScript 允许我们遍历某种类型...
    99+
    2024-04-02
  • 浅谈Java编程中的synthetic关键字
    java synthetic关键字。有synthetic标记的field和method是class内部使用的,正常的源代码里不会出现synthetic field。小颖编译工具用的就是jad.所有反编译工具都不能保证完全正确地反编译clas...
    99+
    2023-05-31
    java synthetic 关键字
  • 浅谈redis整数集为什么不能降级
    目录前言基本结构何时使用intsetintset添加元素类型变动升级加入65535旧数据移位降级为什么不实现降级小结前言 整数集合相信有的同学没有听说过,因为redis对外提供的只有...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作