utf8 与 utf8mb4

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

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

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

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

utf8mb4_bin、utf8mb4_unicode_ci 与 utf8mb4_general_ci

utf8mb4_bin: 将字符串每个字符用二进制数据编译存储,区分大小写,而且可以存二进制的内容。

utf8mb4_general_ci:ci即case insensitive,不区分大小写。是一个遗留的 校对规则,不支持扩展,它仅能够在字符之间进行逐个比较,没有实现Unicode排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致。但是,在绝大多数情况下,这些特殊字符的顺序并不需要那么精确。

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

collate规则:

utf8mb4_bin 大小写敏感

utf8mb4_general_cs 大小写敏感

*_bin: 表示的是binary case sensitive collation,也就是说是区分大小写的

*_cs: case sensitive collation,区分大小写

*_ci: case insensitive collation,不区分大小写

Mysql默认的字符检索策略:utf8_general_ci,表示不区分大小写;utf8_general_cs表示区分大小写,utf8_bin表示二进制比较,同样也区分大小写 。(注意:在Mysql5.6.10版本中,不支持utf8_genral_cs!)

utf8mb4_general_ci P=p Q=q R=r=Ř=ř S=s=ß=Ś=ś=Ş=ş=Š=š sh ss sz

utf8mb4_unicode_ci P=p Q=q R=r=Ř=ř S=s=Ś=ś=Ş=ş=Š=š sh ss=ß sz

如何选择

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

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

准确性

utf8mb4_unicode_ci: 是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序。

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

但是在绝大多数情况下,这种特殊字符的顺序一定要那么精确吗。比如Unicode把ß、Œ当成ss和OE来看;而general会把它们当成s、e,再如ÀÁÅåāă各自都与 A 相等。

性能

utf8mb4_general_ci: 在比较和排序的时候更快

utf8mb4_unicode_ci: 在特殊情况下,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。

但是在绝大多数情况下,不会发生此类复杂比较。general理论上比Unicode可能快些,但相比现在的CPU来说,它远远不足以成为考虑性能的因素,索引涉及、SQL设计才是。

这也从另一个角度告诉我们,不要可能产生乱码的字段作为主键或唯一索引。例如:以url来作为唯一索引,但是它记录的有可能是乱码。

总结:utf8mb4_general_ci 更快,utf8mb4_unicode_ci 更准确。推荐是 utf8mb4_unicode_ci,将来 8.0 里也极有可能使用变为默认的规则。相比选择哪一种collation,使用者更应该关心字符集与排序规则在db里需要统一。

mysql utf8mb4 bin_Mysql的utf8与utf8mb4区别,utf8mb4_bin、utf8mb4_general_ci与utf8mb4_unicode_ci的选择...相关推荐

  1. mysql utf8mb4 java_mysql中utf8和utf8mb4区别

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

  2. mysql utf8mb4 bin_MySQL中utf8字符集、排序规则及utf8mb4_bin列大小写不敏感方法

    utf8mb4 和 utf8 比较 utf8mb4: A UTF-8 encoding of the Unicode character set using one to four bytes per ...

  3. 【Mysql】utf8与utf8mb4区别,utf8mb4_bin、utf8mb4_general_ci、utf8mb4_unicode_ci区别

    一.utf8与utf8mb4区别 UTF8 UTF8mb4 使用1~4个字节,变长的编码格式 mb4即 most bytes 4,使用4个字节来表示完整的UTF-8 最大字符长度为 3 字节,如果遇到 ...

  4. Mysql utf8 和utf8mb4 的区别

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

  5. MySQL的utf8与utf8mb4编码,以及utf8_bin、utf8_general_ci编码区别

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

  6. mysql中utf8和utf8mb4的详解用法与区别

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

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

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

  8. MySQL几种编码格式的区别(utf8、utf8mb4、utf8mb4_general_ci、utf8mb4_unicode_ci 、utf8mb4_0900_ai_ci)

    存储字符集 utf8 和 utf8mb4 utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8 字符,也就是 Unicode 中的基本多文本平面. 要在 Mysql 中保存 4 ...

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

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

最新文章

  1. mongodb 安装_1、MongoDB 安装
  2. web developer tips (39):在Visual Studio 2008中取消远程web操作
  3. C语言实现数据结构之栈的详解
  4. AM,DSB,SSB,FM信号调制matlab
  5. 程序员才能看懂的30张图,看到最后一张我哭了
  6. 一个swiper 两个分页器的写法【总结】
  7. 机器学习中防止过拟合的方法总结
  8. python实现接口_Python | 使用类实现接口
  9. CSS3 盒阴影 box-shadow属性
  10. Visual Studio Code一键设置中文,针对英语不好的学生
  11. delphi mysql 删除_Delphi如何清空日志文件
  12. linux内核tcp_hdr,TCP的URG标志和内核实现
  13. Mac+virtualbox安装win7
  14. 这是互联网变得越来越敌对的7种方式
  15. 群表示论之不可约表示的次数整除G的阶
  16. android hook 第三方app_Android三大hook框架
  17. 努比亚Z5Smini刷机包 正式版时间锁屏 音量唤醒 精简优化 流畅稳定
  18. 实例图解:摄影构图大实话
  19. 5款良心电脑软件,有一款虽已停更,却依然免费使用
  20. Android10.0 展讯平台解锁

热门文章

  1. 看完《三体》,我顿悟了5个最残酷的职场生存法则
  2. Qt样式表使用总结3,我常用的选色方法
  3. laravel:artisan的基本使用
  4. C - Wrap very long lines of input into two or more shorter lines
  5. uniGUI获取设备信息
  6. Unity集成穿山甲后打包报错android:networkSecurityConfig , Picked up JAVA_TOOL_OPTIONS:-Dfile.encoding=UTF-8
  7. biti_rainy
  8. word中自动生成的目录中,编号和文本间距过大
  9. Process 'command 'XXX/Android/Sdk/build-tools/25.0.3/aapt'' finished with non-zero exit value 1
  10. Mark - HDFS性能压测工具