关于编码和解码,简单来讲编码就是把字符转变为二进制数据,解码就是把二进制的数据按照一定的规则翻译成字符,关于编解码的定义只需要了解两个重点:
字符是如何映射成为二进制数据的
那些字符需要映射二进制的数据
比如我们把abcd拆分成四种自定义的编码格式,使用十六进制表示,a占一位,b占两位,c占3位,d占四位,我们可以使用含有abcd的字符进行不同的组合编码,但是不能对于ef,或者zh等等字符进行编码,因为我们设计的规则不认识这些字符,编码之后的数据按照自己设计的编码解码翻译回原来的数据,这就是最简单的编码和解码规则。
如何比较大小
我们知道了如何对于字符进行编码,那么我们如何对于字符进行比较呢?我们最可能想到的规则是按照26个字母的顺序进行比较排序大小,其实二进制的比较规则是非常简单的,但是我们会发现有时候会出现特殊的情况,比如英文有大小写之分,而中文又有同音字的等等,这时候就不能简单二进制比较了,我们需要做如下的调整:
所以其实我们可以发现一个字符可能会存在多个比较方式,最终意味着字符集会出现多种的比较规则形式。
字符集介绍
=====
常见字符集
经过上面的编码介绍之后,下面我们来介绍关于字符集的内容,全世界的字符集怎么也得又个成百上千种,这还不包含各种自创的字符集,但是实际上主流的也就那么几种,比如:GBK2312,UTF-8,UTF-16等等,所以这里只简单列举几个常见的字符集:
这些数字不是敏感词,不需要记住数量,只要注意gb2312并不只是只有中文。
补充:这里可能有小伙伴好奇GB2312是怎么认识不同的字符集的,其实很简单,ASCII只有128个,所以只要是在这个范围的,基本可以断定就是ASCII的字符集,所以使用一个字符即可,如果不在这个范围,直接使用两个字节翻译即可。
补充:既然提到了UTF-8,那么这里就来说一下Unicode编码的事情,其实准确来说utf8只是Unicode字符集的其中一种编码方案,Unicode字符集可以采用utf8、utf16、utf32这几种编码方案,utf8使用1~4个字节编码一个字符,utf16使用2个或4个字节编码一个 字符,utf32使用4个字节编码一个字符。
另外,Mysql早期的utf8并不是真正意义上的utf8这个后续会进行补充
最后我们可以发现,对于同一个字符在不同的字符集会有不同的编码方式,对于一个汉字来说,ASCII字符集没有收录,下面我们比较utf-8和gbk是如何收录的,比如一个字符的’我’汉字假设是如下的编码方式:
如何查看字符集
查看字符集的命令十分简单:show (character set|charset) [like 匹配模式],括号内表示可以任选其中一个,比如选择character set,当然比较难打,所以charset更常用一些,记住这一个即可。
下面是具体的案例,可以看到目前mysql支持41种字符集:
show charset;
armscii8 ARMSCII-8 Armenian armscii8_general_ci 1
ascii US ASCII ascii_general_ci 1
big5 Big5 Traditional Chinese big5_chinese_ci 2
binary Binary pseudo charset binary 1
cp1250 Windows Central European cp1250_general_ci 1
cp1251 Windows Cyrillic cp1251_general_ci 1
cp1256 Windows Arabic cp1256_general_ci 1
cp1257 Windows Baltic cp1257_general_ci 1
cp850 DOS West European cp850_general_ci 1
cp852 DOS Central European cp852_general_ci 1
cp866 DOS Russian cp866_general_ci 1
show charset like ‘big%’;
big5 Big5 Traditional Chinese big5_chinese_ci 2
下面是需要记忆的几个字符集,也是最常用的字符集:
比较规则查看
之前介绍过字符集是有比较规则,mysql吧比较多规则设置为一个命令,查看mysql的比较规则如下:
show collation [like 匹配模式]
下面是比较规则的相关案例,可以看到光是utf开头的比较规则就有150多种:
mysql> show collation like ‘utf_%’;
比较规则的规律
|后缀|英文释义|描述| |:–:–:– | _ai | accent insensitive |不区分重音| | _as | accent sensitive |区分重 音| | _ci | case insensitive |不区分大小写| | _cs | case sensitive |区分大小写| | _bin | binary |以二进制 方式比较|
每种字符集对应若干种比较规则,每种字符集都有一种默认的比较规则,我们可以看到上面的截图中有一个Default的列就是当前字符集的默认比较规则。比方说 utf8 字符集默认的比较规则就是utf8_general_ci
字符集和比较规则级别介绍
下面到了本文的重点,MySQL 有4个级别的字符集和比较规则,分别是:
当然这些特点只是简单列举,下面会按照实际的案例进行一一阐述。
服务器级别规则
MySQL 提供了两个系统变量来表示服务器级别的字符集和比较规则:
下面是具体的案例:
mysql> show variables like ‘character_set_server’;
character_set_server utf8mb4
mysql> SHOW VARIABLES LIKE ‘collation_server’;
collation_server utf8mb4_0900_ai_ci
可以看到这里是标记为utf8mb4,但是如果这里显示是utf8,其实本质上是utf8mb3。最后可以看到上面服务器级别的字符集为utfmb4,而服务器级别的比较规则为:utf8mb4_0900_ai_ci,不过有些人可能是输出:utf8_general_ci
设置字符集和比较规则:
如果想要设置服务器级别的字符集和比较规则,可以使用如下的方式,上一节关于mysql的系统配置中说过可以设置配置文件的内容如下,注意需要分配到[server]的组下面:
[server]
character_set_server=gbk
collation_server=gbk_chinese_ci
数据库级别规则
我们在创建数据库的时候更多的时候使用create database 数据名,但是使用这种语法创建的数据库使用为配置文件配置的字符集和比较规则,下面我们来了解一下如何创建自定义的比较规则和字符集的数据库。
自定义创建数据库字符集和比较规则:
下面是创建自定义数据库级别的字符集和比较规则的语法,当然如果不小心建错了字符集,可以使用alter database来进行修改
create database 数据库名称
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
alter database 数据库名
[[DEFAULT] CHARACTER SET 字符集名称]
[[DEFAULT] COLLATE 比较规则名称];
下面为实际的操作案例以及具体的操作效果:
CREATE DATABASE charset_demo_db
CHARACTER SET gb2312
COLLATE gb2312_chinese_ci;
关于上面的参数[DEFAULT]可以进行忽略,如果我们想要查看当前的数据库比较规则,可以使用下面两个 系统变量进行查看:(前提是使用 USE 语句选择当前默认数据库,如果没有默认数据库,则变量与相应的服务器级别的系统变量具有相同的值)
下面为具体的案例:
如果没有use database,则会显示下面的内容(个人测试)
character_set_database utf8mb3
use charset_demo_db;
show variables like ‘character_set_database’;
character_set_database gb2312
show variables LIKE ‘collation_database’;
collation_database gb2312_chinese_ci
可以看到charset_demo_db使用的还是创建的时候默认的字符集和比较规则,这里有一个需要注意的点是数据库级别的系统变量是只读的,也就意味着character_set_database和collation_database是只读的,不能修改这两个参数修改字符集和比较规则。但是我们可以使用alter database命令修改数据库的级别。
最后,如果不指定字符集和比较规则,这样的话将使用服务器级别的字符集和比较规则作为数据库的字符集和比较规则。
表级别规则
下面我们来看下表级别的规则,表级别顾名思义就是在创建表的时候我们可以追定字符集和字符的比较规则,具体的命令记忆也就是把数据库换成表而已,这里有读者可能注意到的是不能使用charset替代,只有character set这一个写法:
CREATE TABLE 表名 (列的信息)
[[DEFAULT] CHARACTER SET 字符集名称] [COLLATE 比较规则名称]]
ALTER TABLE 表名
[[DEFAULT] CHARACTER SET 字符集名称] [COLLATE 比较规则名称]
下面我们来看下具体的案例:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
[外链图片转存中…(img-medgjwm5-1712308422450)]
[外链图片转存中…(img-c79VBmlV-1712308422450)]
[外链图片转存中…(img-q58h8KnI-1712308422450)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!