📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端工程师
🏆 近期荣誉:华为云云享专家、阿里云专家博主、
🔥 三连支持:欢迎 ❤️关注、👍点赞、👉收藏三连,支持一下博主~
文章目录
- 引言
- 写作目的
- 字符、字符集、字符编码
- 为什么需要字符集
- 常见的字符集
- ASCII字符集
- ISO8859-1字符集
- GB2312字符集
- GBK字符集
- Unicode
- 结束语
引言
陈康肃公善射,当世无双,公亦以此自矜。尝射于家圃,有卖油翁释担而立,睨之久而不去。见其发矢十中八九,但微颔之。康肃问曰:”汝亦知射乎?吾射不亦精乎?”。翁曰:“无他,
但手熟尔。”康肃忿然曰:“尔安敢轻吾射!”翁曰:“以我酌油知之。”乃取一葫芦置于地,以钱覆其口,徐以杓酌油沥之,自钱孔入,而钱不湿。因曰:“我亦无他,惟手熟尔。”康肃笑而遣之。
开篇引言引自六一居士欧阳修的《卖油翁》,旨在告诉各位,简单的事情做对了,难得事情做好了,没有什么好的方法,只是让自己熟练而已。就像我们写文章,浅显的道理大家都懂,却又似懂非懂,最后造成了不懂装懂的地步,而我写文的目的也无外乎贻笑大方,给自己一个博文强记的用途。
写作目的
前几篇博文也可谓是铁打的营盘流水的兵,固定的知识每个人都在写,每个人也都在学习。希望此文对大家也有所帮助。本文想深入了解下MySQL的字符集相关的内容,希望有这方面需求的阅读者可以作为一个参考范本。如果你去MySQL的官网查阅后有新的观点也不妨我们一起探讨、一起学习,共同进步。
字符、字符集、字符编码
什么是字符?
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
什么是字符集?
字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同。在一个字库表中,每一个字符都有一个对应的二进制地址,而编码字符集就是这些地址的集合。
什么是字符编码?
是把字符集中的字符编码为特定的二进制数,以便在计算机中存储。每个字符集中的字符都对应一个唯一的二进制编码。
字符、字符集、字符编码的关系
-
字符是一种符号,具象。
-
字符集是字符的集合。
-
字符集和字符编码一一对应,计算机在读取、解析、显示时根据这个对应关系显示对应的字符编码,使得计算机可以懂得这个约定是什么,最后展示给用户。
为什么需要字符集
当我们阅读上一小节后,这个问题应该就迎刃而解了——计算机底层的运算逻辑要统一——二进制数据。
我们所做的大部分的工作技术含量并不高,而且一直需要不断更新技术的更不多,能把一件事做到极致其实更多的不过是精益求精、不断打磨,不需要太多的技巧,唯熟能尔。
我们需要使用字符集来做运算,比较运算或者说是制定了一套规则,一套大家在计算机层面约定的规则。例如,我们如何知道 字符a 和 字符b 的大小?其实,比较字符的大小,其实是比较底层字符对应底层字符编码规则的顺序位置。 字符a 的底层字符编码为 0x01 字符b 的底层字符编码为 0x02,按照已经约定的规则计算,那么 字符a 排列在 字符b 的前面,所以 字符a 小于 字符b 。当然,这也不是一个肯定结果,例如我们在MySQL数据库中,设置不区分大小写,那么在这种情况下, 字符a 和 字符A 是相等关系。为什么会出现这个问题呢?下面让我们一探究竟。
在我们的这个世界中,有很多字符集,他们描述不同的国家的语言信息。不同国家根据自己的特性制造出来了不同的字符集。常见的字符集有ASCII字符集、ISO8859-1字符集、GB2312字符集、GBK字符集、Unicode字符集(常见的是UTF-8、UTF-16、UTF-32)。
常见的字符集
常见字符集名称:ASCII字符集
、GB2312字符集
、BIG5字符集
、 GB18030字符集
、Unicode字符集
等。
ASCII字符集
最早的编码字符集,全称是American Standard Code for Information Interchange,源于美国信息互换标准编码,基于罗马字母表产生的。ASCII字符集共包含00000000~01111111共128个字符,它表示的范围包括空格、标点符号、数字、大小写字母和一些特殊字符。例如
字符M的ASCII为01001101(十六进制是0x4D,十进制是77)
ISO8859-1字符集
ISO8859-1字符集在ASCII字符集的基础上增加了128个,共256额字符。他还有一个名字:Latin1。默认情况下,MySQL的字符集是Latin1(ISO_8859_1)。至于为什么是这个,请听下回分解。
GB2312字符集
GB2312字符集收录了汉字、拉丁字母、希腊字母、日文(平假名/片假名)、俄语(西里尔字母)等,其中汉字六千多,符号近七百,GB2312字符集兼容ASCII字符集。GB2312字符集使用规则很简单,如果一个字符存在于ASCII字符集中,则采取一字节编码;如果一个字符不存在于ASCII字符集,而存在于GB2312字符集中,那么采取二字节编码。
GBK字符集
GBK字符集在GB2312字符集的基础上面又进行了扩充且兼容GB2312字符集。GBK全称《汉字内码扩展规范》,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字。GBK字符集中,中文字符占2个字节,英文占1个字节。 采用单双字节变长编码方式,英文使用单字节编码,完全兼容ASCII字符编码,中文部分采用双字节编码。
Unicode
这个不用讲太多了,我们常常见到他,无论是做数据运维、还是前后端开发。他收录了所有的字符,目前还在不断的扩充中。Unicode最多可以保存4个字节容量的字符。也就是说,要区分每个字符,每个字符的地址需要4个字节。这是十分浪费存储空间的,于是,程序员就设计了几种字符编码方式,比如:UTF-8、UTF-16、UTF-32。最常使用的就是UTF-8,UTF-8是一种变长字符编码。
注意⚠️:UTF-8不是编码规范,而是编码方式或者说是其中一种解决方案。
结束语
对于同一个字符,采取不同的编码字符集,展示的结果也就不相同。凡是就怕认真二字,真的肯花心思,很难有什么事情做不好。怕就怕,资质平平,却又不肯花心思。那就不得怨天尤人了。我是「Aion」,一个爱钻研的开发者,希望同大家一起分享知识。