mysql utf8mb4 bin_Mysql的utf8与utf8mb4区别,utf8mb4_bin、utf8mb4_general_ci与utf8mb4_unicode_ci的选择...-程序员宅基地

技术标签: mysql utf8mb4 bin  

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里需要统一。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34010461/article/details/113594700

智能推荐

Cocos EaseIn,EaseOut,EaseInOut图解_creator easeinout-程序员宅基地

文章浏览阅读3.6k次。链接:https://blog.csdn.net/u014271114/article/details/47703061_creator easeinout

Python 编写程序,输入1*2*3+3*4*5+5*6*7+......+99*100*101_用循环结构实现计算1*2+2*3+3*4+4*5+5*6的值-程序员宅基地

文章浏览阅读4.6k次,点赞8次,收藏13次。初级编程的练习题,大家可以参考一下,如果能帮助到大家更好。_用循环结构实现计算1*2+2*3+3*4+4*5+5*6的值

下拉框显示数据-程序员宅基地

文章浏览阅读116次。Insert title here --请选择-- _下拉框怎么value="

Python 列表嵌套多种实现方式_for temp in data['result']['formcomponentvalues']:-程序员宅基地

文章浏览阅读3.5k次。Python 列表嵌套多种实现方式#coding=utf-8list=[]for i in range(1,101): list.append(i)# print(list)tempList=[]newList=[]while True: num=0 for temp in list: tempList.append(temp) ..._for temp in data['result']['formcomponentvalues']: templist.append(temp.get(

图解无约而来Win7 33in1 V1.3 32位与64位合一(版本齐全装机利器)_无约而来 33in1 oem windows7-程序员宅基地

文章浏览阅读9k次。图解无约而来Win7 33in1 V1.3 32位与64位合一(版本齐全装机利器) 2012-07-17 11:32:31| 分类:默认分类 | 标签:|字号大中小 订阅无约而来近日发布了将Windows 7 33in1 V1.3 32位与64位整合为一个映像的方法,现转载过来供大家学习实践,并将实际操作截图,手把手教你自己制作。自己整合后可以刻录到u盘上(体_无约而来 33in1 oem windows7

Go语言开发Web应用实战——这本书介绍了如何用Golang开发Web应用,涵盖从基础概念到实践应用等内容-程序员宅基地

文章浏览阅读1.1k次。2019年是第四个十年科技革命的开端,也是Golang被广泛应用的一个年份。这几年,Golang的热度不断提升,在开源社区及企业内部也出现了一批拥抱Go的优秀人员。每当我听到有人宣传“Golang开发更快、更安全、更高效”,或者推荐“Go语言入门”时,都会觉得不可思议。Golang作为新一代的编程语言,非常适合用来开发复杂的分布式系统,但同时它也非常简单易懂,可以轻松地学习掌握。在本书中,你将从零开始构建一个完整的基于Golang+Vue.js+MySQL Web应用程序。

随便推点

cmd move 文件到指定目录下 拒绝访问_cmd move 拒绝访问-程序员宅基地

文章浏览阅读6.9k次。移动文件时,提示C:\Users>move Twisted-19.2.1-cp38-cp38m-win_amd64.whl chenminzhen\appdata\local\programs\python\python37拒绝访问。移动了 0 个文件。解决办法:命令提示符——右键——以管理员身份运行,再输入move命令,问题解决!!!C:\WINDOWS\sys..._cmd move 拒绝访问

react 首页加载loading-程序员宅基地

文章浏览阅读8.2w次。首页加载loading,放在#root里面,代码如下:<!DOCTYPE html><html lang="en"> <head> <meta charset="utf-8"> <meta name="renderer" content="webkit|ie-comp|ie-stand"> ..._s86w.xyz

conda pack环境迁移并下载安装离线包_conda导出环境离线安装包-程序员宅基地

文章浏览阅读798次,点赞15次,收藏20次。训练服务器为了安全起见,限制不能联网,无法直接创建虚拟环境及安装模型的依赖库,所以需要把另一台测试服务器已经部署好的虚拟环境迁移到训练服务器上,并在不能联网的情况下安装一些离线包。过程记录如下记录。_conda导出环境离线安装包

关于网络连接状态的编程_网络连接用什么程序编写-程序员宅基地

文章浏览阅读894次。1. 可以用WMI (Win2K & XP):(首先要在VS.NET中创建一个项目,然后在添加引用中引用一个.net的装配件:System.Management.dll,这样你的项目才能使用WMI)with Windows 2000 & XP, UNDOCUMENTED: MSNdis_MediaConnectStatus - NdisMediaConnectStatus :_网络连接用什么程序编写

js禁止滚动条滚动并且隐藏滚动条_js 去掉滚动条-程序员宅基地

文章浏览阅读7k次。禁止鼠标滑过滚动条滚动document.body.onmousewheel = function () {return false;}恢复鼠标滑过滚动条滚动document.body.onmousewheel = function () {return true;}禁止键盘控制滚动条滚动document.body.onkeydown = function (e) { ..._js 去掉滚动条

八皇后问题(递归,回溯)_八皇后问题 dfs 堆栈-程序员宅基地

文章浏览阅读2.4k次。八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当 n = 1 或 n ≥ 4 时问题有解。因此只需要判断放下的当前位置的棋子的位置是否被之前放下的棋子位置_八皇后问题 dfs 堆栈

推荐文章

热门文章

相关标签