1. 基础知识

1.1 bit , byte , word

字     word

字节  byte (B)

位     bit (b)

1.2 单位换算

1字节 = 8位(1 byte = 8bit)

1字 = 2字节(1 word = 2 byte)

一个汉字 = 2字节

中文标点 = 三个字节

一个英文字母 = 一个字节

英文标点 = 一个字节

Emoji表情或者某些特殊字符 = 4个字节

1.3 Ascll

因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。

最早的计算机在设计时采用8个比特(bit)作为一个字节(byte)。

一个字节能表示的最大的整数就是255(2^8-1=255),而ASCII编码,占用0 - 127用来表示大小写英文字母、数字和一些符号,这个编码表被称为Ascll表,比如大写字母A的编码是65,小写字母z的编码是122。

1.4 Unicode

如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。

类似的,日文和韩文等其他语言也有这个问题。为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。

2. utf8 & utf8mb4

2.1 utf8

是针对Unicode的一种可变长度字符编码。

由于对可以用Ascll表示的字符,使用Unicode并不高效,因为Unicode比Ascll占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。

为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Unicode Transformation Format)。

2.2 utf8mb4(mb4 = most bytes 4)

所以utf8是utf8mb4的子集,除了将编码改为utf8mb4外不需要做其他转换。

MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。

既然utf8应付日常使用完全没有问题,那为什么还要使用utf8mb4呢?

低版本的MySQL支持的utf8编码,最大字符长度为 3 字节,如果遇到 4 字节的字符就会出现错误了。

三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。

也就是说,任何不在基本多文平面的 Unicode字符,都无法使用MySQL原有的 utf8 字符集存储。

可以到以下的链接,看unicode编码区从1 ~ 126就属于传统utf8区,当然utf8mb4也兼容这个区,126行以下就是utf8mb4扩充区,什么时候你需要存储那些字符,你才用utf8mb4,否则只是浪费空间。

编码http://blog.csdn.net/leelyliu/article/details/52879685

2.3 utf8mb4比utf8多了emoji编码支持

如果实际用途上来看,可以给要用到emoji的库或者说表,设置utf8mb4.

比如评论要支持emoji可以用到.

建议普通表使用utf8 如果这个表需要支持emoji就使用utf8mb4

2.4 排序规则

排序规则选择常用的有utf8_general_ci , utf8_unicode_ci

utf8_unicode_ci   是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序 , 为了能够处理特殊字符的情况,实现了略微复杂的排序算法。

所以  utf8_unicode_ci   的准确性比较好 , 但是性能相对比较低。

utf8_general_ci  没有实现Unicode排序规则,在遇到某些特殊语言或字符是,排序结果可能不是所期望的。

比如Unicode把ß、Œ当成ss和OE来看;而general会把它们当成s、e,再如ÀÁÅåāă各自都与 A 相等。在比较和排序的时候更快 ,所以utf8_general_ci  的准确性较低 , 但是性能比较好。通常情况下 utf8_general_ci的准确性就够我们用的了。

索引长度,从utf8转utf8mb4,容易引起索引键超长错误,InnoDB有单个索引最大字节数 768 的限制,而字段定义的是能存储的字符数,比如 VARCHAR(200) 代表能够存200个汉字,索引定义是字符集类型最大长度算的,超过768后抛出异常。

2.5 推荐新项目中使用utf8mb4的编码

UTF-8 编码是一种变长的编码机制,可以用1~4个字节存储字符。

因为历史遗留问题,MySQL 中的 utf8 编码并不是真正的 UTF-8,而是阉割版的,最长只有3个字节。

当遇到占4个字节的 UTF-8 编码,例如 emoji 字符或者复杂的汉字,会导致存储异常。

从 5.5.3 开始,MySQL 开始用 utf8mb4 编码来实现完整的 UTF-8,其中 mb4 表示 most bytes 4,最多占用4个字节。

从 8.0 之后,将会在某个版本开始用 utf8mb4 作为默认字符编码。

创建数据库时,如果没有指定字符集,会采用服务器的默认字符集。设置服务器默认字符集为 utf8mb4 可以提高便利性。

utf8和utf8mb4的区别相关推荐

  1. utf8和utf8mb4的区别详解

    utf8和utf8mb4的区别 一.简介 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode.utf8mb4是utf ...

  2. Mysql utf8 和utf8mb4 的区别

    相关内容: 记一次Mysql查询字段为空串在java中使用equals不相等的问题 Mysql 批量更改数据表和字段的字符集(Mysql UTF-8字符集更改为utf8mb4字符集) 前言 我们新建m ...

  3. MySQL中 utf8 和 utf8mb4 的区别,以及 general_ci 、unicode_ci和unicode_520_ci的区别

    首先了解什么是Unicode: Unicode是一种信息技术(IT)标准,用于对世界上大多数书写系统中表示的文本进行一致的编码,表示和处理. 大致意思就是Unicode对英文字符.符号.汉字.表情符号 ...

  4. mysql字符集 utf8 和utf8mb4 的区别

    文章目录 @[toc] 总结速览 什么是编码?什么是 UTF-8? mysql中的utf8与utf8mb4 为什么使用utf8mb4 总结 最后 用mysql创建数据库表时,一般都会选择用utf-8编 ...

  5. 全面了解mysql中utf8和utf8mb4的区别

    一.简介 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode.好在utf8mb4是utf8的超集,除了将编码改为ut ...

  6. 浅谈MySQL中utf8和utf8mb4的区别

    一.什么是UTF8MB4? 我们在使用PhpMyAdmin管理面板时,可以在首页看到名为"Server connection collation"(服务器连接排序规则)的选项,用来 ...

  7. mysql utf8跟utf8mb4_MySQL utf8 和 utf8mb4 的区别

    utf-8 时变化长度的编码,储存一个code point 需要1~4个字节. 然而,mysql的utf8只存储最多3个字节per code point. 所以,utf8字符集不能存储所有的unico ...

  8. mysql utf8 和 utf8mb4 的区别

    1. utf8 与 utf8mb4 异同 MySQL在 5.5.3 之后增加了 utf8mb4 字符编码,mb4即 most bytes 4.简单说 utf8mb4 是 utf8 的超集并完全兼容ut ...

  9. SpringCloud工作笔记071---mysql字符集 utf8 和utf8mb4 的区别_utf8是不能存储emoji表情字符集的

    JAVA技术交流QQ群:170933152 可以简单的理解 utf8mb4 是目前最大的一个字符编码,支持任意文字. 为什么会有UTF8MB4? 既然utf8应付日常使用完全没有问题,那为什么还要使用 ...

最新文章

  1. 快速安装rrdtool
  2. crontab定时巡检使用
  3. 【Python1】双系统安装,深度学习环境搭建,目标检测(Tensorflow_API_SSD)
  4. 黑马ee在职进阶视频_进阶– Java EE 7前端5强
  5. 国内外知名工业交换机品牌有哪些?
  6. linux远程打开windows程序,为新手讲解Linux和Windows系统的远程桌面访问知识
  7. 全网最细之super讲解
  8. 8086/8088内部结构
  9. python使用redis_使用Redis和Python构建自行车共享应用
  10. ScalaTour 2.函数
  11. 前后端怎么连接_如何搭建前后端分离的测试平台
  12. CAN总线基础知识(二)
  13. GridBagLayout用法
  14. GPU图形加速型云服务器是什么?
  15. 视频号运营指南百科书,新手必备干货丨国仁网络
  16. Java统计List中每个元素出现的次数、用java实现生成或显示文件的一些数字、微信小程序开发回顾
  17. 20154312 曾林 ExpFinal CTF Writeup
  18. HACKTHEBOX——Blocky
  19. Number of Pairs(思维)
  20. maven依赖的添加

热门文章

  1. vim可视化在线配色器
  2. nO a3i会用上鸿蒙系统么,华为nova3i 真的超级好用哦
  3. 记一次 .NET 某智能交通后台服务 CPU爆高分析
  4. 3-SII--Android的SD卡文件读写
  5. python socks代理 命令行_Python使用socks代理
  6. ios友盟错误_iOS - 友盟错误分析
  7. python读取股票数据_python2自动读取股票数据示例
  8. Android-x86
  9. 推荐系统(十五)多任务学习:谷歌MMoE(Multi-gate Mixture-of-Experts )
  10. ABP VNext学习日记2