-
-
- 🥕 4.1、MySQL支持的字符集
-
-
🥔 4.2、MySQL中utf-8和utf-8mb4的区别
-
🥭 4.3、MySQL支持的比较规则
-
🐫 五、MySQL中的字符集和比较规则的应用
-
-
- 🍈 5.1、查看/设置MySQL服务器级别字符集和比较规则
-
-
🍉 5.2、查看/设置数据库级别字符集和比较规则
-
🍈 5.3、查看/设置表级别字符集和比较规则
-
🍇 5.4、查看/设置列级别字符集和比较规则
-
🍋 5.5、知道字符集后有什么作用
-
🍊 5.6、小结
-
🍊 六、MySQL中客户端与服务端之间字符集的使用
-
-
- 👦 6.1、乱码的产生
-
-
👶 6.2、字符集转换
-
👧 6.3、MySQL中客户端与服务端之间字符集的转换
-
🧑 6.4、MySQL中客户端与服务端间字符集转换的一些疑问
-
💅 小结
-
🐠 七、比较规则的使用
-
🐋 参考资料
-
🐏 写在最后
一: 前言 |
============================================================================
-
大家好,我是小诚,又到了愉快的学习时间,本篇章主要给大家介绍的是数据库中字符集和比较规则的知识,由浅入深,理解乱码产生的原因。
-
安利一下,如果在学习过程中遇到任何问题,都可以私信我哦!更多文章,大家可以点击《从0到1-全面深刻理解MySQL系列》了解!
-
《从0到1-全面深刻理解MySQL系列》系列文章会持续更新,感兴趣的小伙伴可以关注我,一起加油,一起进步!,如有帮助,不要忘记一键三联哦,ღ( ´・ᴗ・` )比心!
二: 带着问题学习 |
================================================================================
在文章开始前,大家可以先考虑几个问题,这样方便更快理解文章的知识点,下面的问题都会在文章中找到答案哦!
1、字符集、编码、解码的概念是否真的理解?
2、常见的字符集如UTF-8,GBK等存在什么差异?
3、数据库中如何设置字符集类型?
4、什么是比较规则,数据库中如何设置比较规则类型?
5、什么是乱码,为什么会产生乱码?
6、MySQL中UTF-8、UTF-8mb3、UTF-8mb4有什么区别?
三: 字符集 |
==============================================================================
学习过计算机的都知道,计算机只能存储二进制的数据即0和1,那平常我们使用电脑中展示的表情包、字符串等数据计算机是如何识别,进行存储的呢?
显而易见,是建立非二进制数据(如:表情包、字符串)和二进制数据(0和1)之间的映射关系,通过它们的映射关系,我们能够进行相互转换,实现与计算机之间得交互,当存储到计算机中时则转换成对应的二进制数据,当需要在电脑展示时则转换成非二进制数据。但是,建立这种映射关系我们需要考虑哪些问题呢?
如需建立两者的映射关系,我们需要考虑以下的问题:
1、确定建立映射的字符范围即:哪些字符是需要和二进制数据建立映射?
2、如何实现两者之间的映射即:映射的规范是什么?
其实,上面的这两个问题我们平常的计算机使用者是无法接触到的,字符集的制定是有专门的组织如ISO/IEC等来进行制定的,制定后经过实践是可行的才会应用到计算机中。
虽然,这个过程我们是无法参与,但是,我们要知道它们产生的原因,因为不同区域是使用不同的语言进行交流,视觉上的体现就是使用不同的符号进行沟通,如美国,英国等地方就是使用26个字母、数字等字符进行交流,而我们国家则会存在更加复杂的各式各样的文字,所以,字符集是为了适应不同区域通过计算机之间完成交流而产生的。
在更进一步认识字符集之间,需要了解一些相关概念。
🍈 1.1、字符集
可以理解为某些字符组成的一个集合,集合中由哪些字符组成是由制定这个字符集的协会来决定。
🍆 1.2、字符集与字符编码的区别
**字符编码则是:将字符集中的字符映射为特定的字节或者字节序列,它表示的是一种规则。**通常特定的字符集采用特定的编码方式(即一种字符集对应一种字符编码,如: ASCII、ISO-8859-1、GB2312、GBK都是表示了字符集又表示了对应的字符编码,但Unicode字符集是特例,它对应的字符编码有:UTF-8、UTF-16、UTF-32等)
如:我们自定义一个my字符集和字符编码,它的一个规则如下:
1、包含的字符:‘h’、‘l’,‘o’,‘e’
2、编码规则: 一个字符需要一个字节编码(注: 1byte(字节) = 8bit,1bit对应的就是一个0或者1),则字符和字节的映射关系如下:
通过上面的映射关系我们知道my字符集可以组成许多不一样的字符,具体如下:
🍍 1.3、编码
将一个字符映射成二进制数据的过程叫做编码,如:‘a’ => 0000 00001
🌽 1.4、解码
将一个二进制数据映射成一个字符的过程叫做解码,如:0000 00001 => 'a’
🍤 1.5、举例说明编码与解码的过程
通过上面的基础规则学习,我们已经对字符集、编码、解码等基础知识有了基本的认识。现在我们就通过图形化来举一个例子更加形象理解的这些知识(以:ASCII字符集为准,用我们编程入门的最常见的字符串:hello world为例子)
编码: 在屏幕输入文字 -> 根据指定编码类型 -> 将输入的文字编码成计算机能够识别的二进制数 -> 计算机存储编辑成的二进制数值
解码: 计算机读取存储的二进制数值 -> 根据指定的解码类型解码 -> 将二进制数值解码成字符集中表达的字符 -> 在屏幕显示
🍅 1.6、变长字节编码方式
⼀个字符在编码需要的字节数可能不同的编码⽅式称为变长编码⽅式,比如GB2312编码方式,因为GB2312字符集兼容了ASCII字符,所以当一个字符串中有的字符属于ASCII字符集中的字符时,它编码时需要占用的字节数为1,如果字符属于ASCII字符集中没有的,则编码时需要占用2个字节。
举例说明: 比如字符串’日b’,其中’日’不属于ASCII字符集中的字符,需要⽤2个字节进行编码,假设编码后的⼗六进制表示为0xCD2,'u’属于ASCII字符集的字符,需要⽤1个字节进⾏编码,假设编码后的⼗六进制表示为0x15,所以拼合起来就 是0xCD215。
================================================================================
🍑 2.1、常见的字符集类别
ASCII、GB2312、Unicode、GBK等
🍒 (一)ASCII字符集和ASCII编码
ASCII字符集: 全称《美国信息交换标准代码》,主要用于显示现代英语和其它西欧语言,主要包括:可显示字符(英文字母、阿拉伯数值、标点符号)、以及控制字符(回车、换行、退格等特殊字符)。
ASCII编码: 使用一个字节编码,美国定制的交换标准,目的是将ASCII字符集包含的字符转换成计算机能够识别的二进制(0和1),它是最通用的信息交换标准,到目前为止总共定义了128个字符。
ASCII编码缺点: 只能显示26个基本拉丁字母、阿拉伯数目字和英式标点符号,因此只能用于显示现代美国英语(而且在处理英语当中的外来词如naïve、café、élite等等时,所有重音符号都不得不去掉,即使这样做会违反拼写规则),而且对其他的语言支持力度也不大,所以现在苹果也使用Unicode替换ASCII。
🍓 (二) ISO 8859-1字符集
别名latin1,使用一个字节编码,兼容ASCII字符集,是在ASCII字符集的基础上⼜扩充了128 个⻄欧常⽤字符(包括德法两国的字⺟),共收录256个字符。
🥝 (三)GBXXXX字符集
(1) GB2312字符集:
-
全称:《信息交换用汉字编码字符集》,刚开始ASCII字符集只包含了阿拉伯数字、字母和一些特殊符号,这个编码只适用于美国和西方的一些国家,而不适用于使用汉字的国家,为了使用汉字的国家也能够和计算机进行沟通,中国国家标准总局发布了标准号为:GB2312的编码格式,它适用于汉字处理、汉字通信等系统之间的信息交换,除了中国大陆使用外,新加坡等地也采用此编码(中国雄起!)。
-
GB2312字符集共收录了6763个简体汉字,它的收录包括了拉丁字母、日文平假名等在内的682个全角字符,GB2312编码可以将GB2312字符集包含的字符转换成计算机能够识别的二进制0和1。
-
特点: 因为它兼容了ASCII字符集,所以在编码方式上存在多种情况,如果字符属于ASCII字符集中的字符的话,则编码时需要使用1个字节进行编码,如果不属于ASCII字符集,则需要使用2个字节进行编码。
(2)GBK字符集
-
全称:《汉字内码扩展规范》,因为GB2312字符集编码只支持简体汉字和一些特殊符号,繁体字和一个特殊简体字都没有收录其中,所以微软针对GB2312做了拓展,在GBK字符集中收录了繁体字,并最早在Window95简体中文版使用。
-
GBK拓展了GB2312字符集,共收录了两万多个文字,GBK编码可以将GBK字符集收录的字符转换成计算机能够识别的二进制0和1。
(3)GB18030字符集
-
全称: 国家标准GB 18030-2005《信息技术 中文编码字符集》,因为GBK是由微软首先制定的,并不属于国家标准,所以国家为了兼容GBK字符集制定了GB18030字符集,它是中华人民共和国现时最新的内码字集,除了兼容GBK字符集外,还支持GB 13000及Unicode字符集的全部统一汉字。
-
GB 18030字符集共收录汉字七万多个,并且存储方式采用的是可变长字节编码,每个字可以由1个、2个或4个字节组成。
🥥 (四)Unicode字符集
-
Unicode字符集的出现: 当计算机出现在全球各地时,为了与计算机进行交流,指定了各种各样的标准如GB232/GBK/GB18030/BIG5的编码方案,如果只在符合对应标准的地区使用则完全没有问题,但是如果通过网络与其他的地区进行交流时,因为各地的编码的标准都不一样,就会在转换中出现"乱码"现象,为了解决这个问题,Unicode字符集应运而生。
-
Unicode也称为: 统一码/万国码/单一码,它是业界的一种标准,通过它计算机可以实现世界上不同地区数十种文字的显示,2005年Unicode就已经收录了超过十万个字符,现在由Unicode组织进行管理运作,它收录地球上能想到的所有字符,而且还在不断扩充。
-
Unicode编码系统为表达任意语言的任意字符而设计,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
-
Unicode编码标准现在有三种具体实现,分别是:UTF-8、UTF-16、UTF-32。
(1) UTF-8字符编码:
-
它是实现了Unicode编码方案的一种可变长字符编码(定长码),也是一种前缀码。
-
它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部分修改,即可继续使用。
-
UTF-8已经逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。
-
互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。
-
UTF-8编码使用一至四个字节为每个字符编码(其中ASCII字符集中的128个字符只占1字节,还有附加符文的拉丁文、希腊文等需要2个字节,其他常用的文字占用3个字节,还有极少数的字符占用4个字节)。
(2) UTF-16字符编码:
-
它是实现了Unicode编码方案的一种可变长字符编码(定长码)
-
因为Unicode字符集中收录了很多字符,但是常用的一般不会超过65535个以外的字符,所以出现了UTF-16(2字节=16位)。
-
UTF-16优点: 它在空间效率上比UTF-32高两倍,因为每个字符只需要2个字节来存储(除去65535范围以外的),而不是UTF-32中的4个字节。
-
UTF-16缺点: 不兼容ASCII。
(3) UTF-32字符编码:
-
它是实现了Unicode方案的一种定长字符编码。
-
它使用4个字节的数字来表示每个字母、符号,或者表意文字(ideograph)。
-
优缺点: 使用4个字节存储每个字符,效率高,处理速度快(因为不用计算需要几个字节进行存储),但是浪费空间。
🥑 (五)字符集知识拓展
更多关于字符集的知识,可以到《全网最全面、全详细的编码、解码知识!!!》查看。
三: 比较规则 |
=================================================================================
通过上文我们知道字符集就是包含了多个字符组合的一个集合,既然存在这样一个集合,那它们的是如何比较不同字符的大小呢?这里就需要我们的第二位主角-比较规则大佬登场了
比较规则: 字符集中字符的一个比较大小的规则,一个字符集中可以存在多个比较规则。最常见的比较方式就是字符映射后的二进制比较,英文名也叫binary collation,如:字符a对应的二进制为0000 0001,字符b对应的二进制为0000 0010,则我们可以说在这种规则下字符b大于字符a。
四: MySQL中的字符集和比较规则 |
=========================================================================================
通过上面的介绍,大家应该已经对字符集和比较规则的一些概念有了大致的了解,下面我们就开始结合MySQL来进行真正的实战。
🥕 4.1、MySQL支持的字符集
查询命令: show charset或者character set like '字符集的名称’
(一)、通过下图可知,MySQL数据库默认支持41种字符集,下图关键词的含义:
1、Charset列为字符集的名称
2、Default collation列为字符集对应的默认比较规则(因为一种字符集是可以存在多种比较规则的)
3、Maxlen列则表示这种字符集编码(表示)一个字符时最多需要多少个字节。
(二)、常用的字符集一个字符编码需要的最大字节数
🥔 4.2、MySQL中utf-8和utf-8mb4的区别
在上面的截图中,可能有人会有疑问,为什么mysql会支持两种utf-8(即utf-8和utf-8mb4)类型的编码?它们之间存在什么区别?
我们在上面介绍Unicode字符集时有说到,其实utf-8,utf-32都是属于Unicode字符集的一种编码方案,utf-8编码方案表示一个字符需要1~4个字节,但是,在实际生活中常用的字符实际上只需要3个字节即可表示,在数据库中,表示字符的大小会影响到数据存取的性能,所以MySQL数据库的设计者就定义类utf-8和utf-8mb4两套方案。
1、utf-8也叫utf-8mb3: 代表一个字符只需要1~3个字符。
2、utf-8mb4: 代表一个字符需要使用1-4个字符,也就是我们平常说的真正的utf-8编码。
区别: 在MySQL数据库中,utf-8是utf-8mb3的别名,它是使用1~3个字节来表示一个字符的,如果需要使用4个字节表示一个字符的,如存储emoji表情包,需要使用utf-8mb4编码方案。
🥭 4.3、MySQL支持的比较规则
查询命令: show collation like ‘比较规则名(可以模糊查询)’
(一)、由下图可知,现在MySQL数据库支持222种比较规则,每种字符集可能存在多种比较规则,它们的规律如下:
1、比较规则都是以字符集的名称开头,如下图2中的utf-32比较规则都属于utf-32字符集。
2、下划线的第二个单词表示的是该比较规则是使用于哪种语言,如:utf-32_spanish_ci则表示使用西班牙语的规则比较,utf-32_general_ci则表示是一种通用的比较规则。
3、结尾的单词表示是否区分不同语言中的重音、大小写等策略,常见的结尾词语含义如下:
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!
![img](https://i-blog.csdnimg.cn/blog_migrate/ff08fe56036cd994b1e93562b9560964.jpeg)
分享
这次面试我也做了一些总结,确实还有很多要学的东西。相关面试题也做了整理,可以分享给大家,了解一下面试真题,想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止!
Spring Cloud实战
Spring Boot实战
面试题整理(性能优化+微服务+并发编程+开源框架+分布式)
术停滞不前!**
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-prlcq9aq-1711480685605)]
[外链图片转存中…(img-fsI3UWOv-1711480685605)]
[外链图片转存中…(img-cRlPPaQF-1711480685606)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!
![img](https://i-blog.csdnimg.cn/blog_migrate/ff08fe56036cd994b1e93562b9560964.jpeg)
分享
这次面试我也做了一些总结,确实还有很多要学的东西。相关面试题也做了整理,可以分享给大家,了解一下面试真题,想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止!
[外链图片转存中…(img-E2JKyz0v-1711480685606)]
Spring Cloud实战
[外链图片转存中…(img-CrJ96keB-1711480685606)]
Spring Boot实战
[外链图片转存中…(img-1gvsl8en-1711480685606)]
面试题整理(性能优化+微服务+并发编程+开源框架+分布式)
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!