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 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。

三、问题根源

最初的 UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。

utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8字符,也就是 Unicode 中的基本多文本平面。

Mysql 中的 utf8 为什么只支持持最长三个字节的 UTF-8字符呢?我想了一下,可能是因为 Mysql 刚开始开发那会,Unicode 还没有辅助平面这一说呢。那时候,Unicode 委员会还做着 “65535 个字符足够全世界用了”的美梦。Mysql 中的字符串长度算的是字符数而非字节数,对于 CHAR 数据类型来说,需要为字符串保留足够的长。当使用 utf8 字符集时,需要保留的长度就是 utf8 最长字符长度乘以字符串长度,所以这里理所当然的限制了 utf8 最大长度为 3,比如 CHAR(100)  Mysql 会保留 300字节长度。至于后续的版本为什么不对 4 字节长度的 UTF-8 字符提供支持,我想一个是为了向后兼容性的考虑,还有就是基本多文种平面之外的字符确实很少用到。

要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以后的才支持(查看版本: select version();)。我觉得,为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8.  对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR  替代 CHAR。

mysql utf8 4位_mysql中utf8和utf8mb4区别相关推荐

  1. mysql获取当月最后一天_mysql中获取本月第一天、本月最后一天、上月第一天、上月最后一天

    mysql获取当月最后一天_mysql中获取本月第一天.本月最后一天.上月第一天.上月最后一天等等 转自: https://blog.csdn.net/min996358312/article/det ...

  2. mysql gbk编码 字节数_MySql中UTF8和GBK编码中文字符长度问题

    2.设计函数,输入为一个字符串,里边包含中文.英文.数字等字符,编码为GBK.中文字符的编码规则假定为:双字节组成,高字节大于0x80,低字节任意.     a) 用常用语言(c/c++/php/ja ...

  3. mysql 创建 utf8 的数据库_mysql创建utf8数据库

    CentOS6.5下通过Shell创建.备份.还原MySQL数据库 CentOS6.5下通过Shell创建.备份.还原MySQL数据库 创建数据库: mysql -uroot -p123456 -e ...

  4. php utf8(无bom),php中utf8 与utf-8 与utf8 无BOM

    utf8 与utf-8 相信很多程序员刚开始也会有这样的疑惑,如题,我也是. 其实,他们可以这样来区分. 一.在php和html中设置编码,请尽量统一写成"UTF-8",这才是标准 ...

  5. mysql乱码的问题_MySQL中出现乱码问题的终极解决宝典

    MySQL出现乱码的原因 要了解为什么会出现乱码,我们就先要理解:从客户端发起请求,到MySQL存储数据,再到下次从表取回客户端的过程中,哪些环节会有编码/解码的行为.为了更好的解释这个过程,博主制作 ...

  6. mysql日期格式化季度_mysql中常用日期比较与计算函数

    MySql中时间比较的实现 unix_timestamp() unix_timestamp 函数可以接受一个参数,也可以不使用参数. 它的返回值是一个无符号的整数.不使用参数,它返回自1970年1月1 ...

  7. mysql怎么查看代码_MySQL中的编码查看与设置(转载)

    1.查看数据库编 2.查看数据表的编码格式 3.创建数据库时指定数据库的字符集 mysql>create database character set utf8; 4.创建数据表时指定数据表的编 ...

  8. mysql sql 时间比较_mysql中sql语句进行日期比较

    这里是一个使用日期函数的例子.下面的查询选择了所有记录,其date_col的值是在最后30天以内: mysql> SELECT something FROM table WHERE TO_DAY ...

  9. java中utf-8怎么设置_eclipse中UTF-8设置

    eclipse中UTF-8设置 1.windows->Preferences 打开"首选项"对话框: 2.然后,general->Workspace,右侧Text fi ...

最新文章

  1. Learn OpenGL (十二):投光物
  2. 清华官宣:前百度总裁张亚勤正式加盟清华大学
  3. 可解释性 or 准确性?AI 模型就一定不能两者兼得吗?
  4. 可以从max中导出静态模型并渲染了。
  5. UIPopoverController的使用
  6. PhpYun人才系统 整合 Ucenter 之后,会员注册提示”该 Email 已经被注册!“的解决方案
  7. 2020年国内电影总票房突破100亿元
  8. python相关性系数显著性检验_Python气象数据处理与绘图(4):显著性检验
  9. 2FSK在瑞利衰落信道下的相干与非相干解调误码率-MATLAB基带仿真
  10. 前馈电容的作用-DCDC
  11. 因数分解——Pollard' p-1 Pollard rho
  12. 天蝎座最适合的职业-天蝎座不同型血适合工作分析
  13. 联想机架式服务器安装文档,联想智能超算平台LiCO安装手册.docx
  14. 毕业设计--智能环境监测系统基于harmonyOS的移动端应用开发
  15. 如何查看公众帐号粉丝的微信号
  16. saber框架 blade-core-tool:2.5.1 maven无法正常下载
  17. 伤疤好了有黑印怎么办_脸上疤掉了黑印怎么办 五种方法去除黑印
  18. 华为b6手环能升级鸿蒙吗,华为手环B6,终于等到你!两年磨一剑的升级,亮点多多!...
  19. 全国青少年编程等级考试scratch四级真题2022年12月(含题库答题软件账号)
  20. Django前后端分离1——jwt

热门文章

  1. java学习(80):GULqq界面
  2. 实例60:python
  3. QIcon 给按钮和动作添加图片
  4. 阿里云设置域名解析到主机ip
  5. jackson java网络接口_java~jackson实现接口的反序列化
  6. 做小程序的流程总结(基本篇)
  7. SMB MS17-010 利用(CVE-2017-0144 )
  8. unicode 与 utf-8
  9. 作业3(学习进度表)【第四周】
  10. Analysis of Cloud Computing Architectures阅读笔记--提出了Screen虚拟化方法