1. utf8 与 utf8mb4 异同

MySQL在 5.5.3 之后增加了 utf8mb4 字符编码,mb4即 most bytes 4。简单说 utf8mb4 是 utf8 的超集并完全兼容utf8,能够用四个字节存储更多的字符。

但抛开数据库,标准的 UTF-8 字符集编码是可以用 1~4 个字节去编码21位字符,这几乎包含了是世界上所有能看见的语言了。然而在MySQL里实现的utf8最长使用3个字节,也就是只支持到了 Unicode 中的 基本多文本平面(U 0000至U FFFF),包含了控制符、拉丁文,中、日、韩等绝大多数国际字符,但并不是所有,最常见的就算现在手机端常用的表情字符 emoji和一些不常用的汉字,如 “墅” ,这些需要四个字节才能编码出来。

注:QQ里面的内置的表情不算,它是通过特殊映射到的一个gif图片。一般输入法自带的就是。

也就是当你的数据库里要求能够存入这些表情或宽字符时,可以把字段定义为 utf8mb4,同时要注意连接字符集也要设置为utf8mb4,否则在 严格模式 下会出现 Incorrect string value: /xF0/xA1/x8B/xBE/xE5/xA2… for column 'name'这样的错误,非严格模式下此后的数据会被截断。

提示:另外一种能够存储emoji的方式是,不关心数据库表字符集,只要连接字符集使用 latin1,但相信我,你绝对不想这个干,一是这种字符集混用管理极不规范,二是存储空间被放大(读者可以想下为什么)。

2. utf8mb4-unicodeci 与 utf8mb4-generalci 如何选择

符除了需要存储,还需要排序或比较大小,涉及到与编码字符集对应的 排序字符集(collation)。ut8mb4对应的排序字符集常用的有 utf8mb4_unicode_ciutf8mb4_general_ci

主要从排序准确性和性能两方面看:

  • 准确性
    utf8mb4_unicode_ci 是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序
    utf8mb4_general_ci 没有实现Unicode排序规则,在遇到某些特殊语言或字符是,排序结果可能不是所期望的。
    但是在绝大多数情况下,这种特殊字符的顺序一定要那么精确吗。比如Unicode把ߌ当成ssOE来看;而general会把它们当成se,再如ÀÁÅåāă各自都与 A 相等。
  • 性能
    utf8mb4_general_ci 在比较和排序的时候更快
    utf8mb4_unicode_ci 在特殊情况下,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。
    但是在绝大多数情况下,不会发生此类复杂比较。general理论上比Unicode可能快些,但相比现在的CPU来说,它远远不足以成为考虑性能的因素,索引涉及、SQL设计才是。 我个人推荐是 utf8mb4_unicode_ci,将来 8.0 里也极有可能使用变为默认的规则。相比选择哪一种collation,使用者应该更关心字符集与排序规则在db里要统一就好。

这也从另一个角度告诉我们,不要可能产生乱码的字段作为主键或唯一索引。我遇到过一例,以 url 来作为唯一索引,但是它记录的有可能是乱码,导致后来想把它们修复就特别麻烦。

mysql utf8 和 utf8mb4 的区别相关推荐

  1. Mysql utf8 和utf8mb4 的区别

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

  2. utf8和utf8mb4的区别详解

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

  3. mysql utf8转化utf8mb4

    mysql utf8转化utf8mb4 (字符集转化,批量更改为utf8mb4) SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' CONVERT TO CHARAC ...

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

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

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

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

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

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

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

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

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

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

  9. utf8和utf8mb4的区别

    1. 基础知识 1.1 bit , byte , word 字     word 字节  byte (B) 位     bit (b) 1.2 单位换算 1字节 = 8位(1 byte = 8bit) ...

最新文章

  1. 机器学习常见的分类算法的优缺点
  2. python爬取电影网站信息并写入文件
  3. caffe-ssd编译、训练、测试全过程(最后有彩蛋)
  4. 十三、JSP9大隐视对象中四个作用域的大小与作用范围
  5. 【演化计算】【论文研读】Completely Automated CNN Architecture Design Based on Blocks
  6. lisp语言如何画小红点_实验四、五 用AutoCADLISP语言编程绘图
  7. 内存:DDR2与DDR
  8. LINUX安装C#开发环境
  9. 程序员必须掌握的十大经典算法
  10. Mac m1 安装jdk
  11. 用计算机检索生物学文献,文献检索期末复习
  12. 【异常】because it is a JDK dynamic proxy that implements
  13. ROS(sub,pub)测试 Plotjuggler
  14. 外汇买入价、外汇卖出价、现钞买入价有什么区别?
  15. Python Revisited Day 08 (高级程序设计技术)
  16. 台式电脑上没有显示计算机怎么办,电脑显示器无视频输入怎么办
  17. VUE中使用高德地图.做个轨迹添加器,为路线规划做数据
  18. HP收购3com给网络世界带来的变化
  19. 罗杨美慧 20180912-3 词频统计
  20. 使用Django+MySQL快速搭建一个属于自己的网站

热门文章

  1. 六一书单 | 童年的快乐,藏在每一本书里
  2. QQ会员的“十元”生意逻辑:人以群分
  3. SpringCloud第三话 -- 基于Nacos实现注册中心以及远程服务调用
  4. 那些异常火爆的餐饮店处处都是套路,今天为各位分享7个小妙招!
  5. FinalShell教程
  6. 从iphone5上市推迟时间看产品营销策略
  7. 快速把微信里想保存的图片视频转存到电脑
  8. 吉大软件专硕896-2008
  9. Vue请求URL格式化,拒绝分号自动转义
  10. java获取项目的相对路径_在JAVA文件中获取该项目的相对路径