MySQL数据分析-(14)表补充:字符集
大家好,我是jacky朱元禄,很高兴继续跟大家学习《MySQL数据分析实战》,本节课程jacky分享的主题是表补充之字符集
在分享课程之前,jacky在跟大家强调一下逻辑的重要性,我们学习任何一门技术首先要捋清楚的就是逻辑,对于本节课来说,我们要捋清的逻辑就是:
- 1)字符集是什么,它存在的意义是什么?
- 2)它能给我们解决什么问题?
- 3) 为什么我们在创建表这里讲这个字符集,它跟我们前面讲的数据类型、字段属性、索引有什么传承关系?
- 或者说对于整个课程来说,为什么我们不在前面的课程,或后面的课程来讲字符集,我们要在这堂课来讲,jacky肯定是有他安排的逻辑在的,这些我们都要搞懂,我们说搞懂逻辑比搞懂知识点本身更重要;
- 或者说对于整个课程来说,为什么我们不在前面的课程,或后面的课程来讲字符集,我们要在这堂课来讲,jacky肯定是有他安排的逻辑在的,这些我们都要搞懂,我们说搞懂逻辑比搞懂知识点本身更重要;
下面我们来说字符集,确切的说是MySQL中的字符集
(一)计算机字符集的由来
我们讲第一部分,计算机字符集的由来,讲这部分是回答我们第一个逻辑:字符集是什么,它存在的意义是什么?
为了讲清楚这部分,jacky先给大家讲个故事:
很久很久以前,有这么一群人,发现了计算机的最底层逻辑,就是电路,现阶段,我们人类处理电路可能的办法只能是让它通电,或者不通电,这时这群人就想:对于电路最底层的两种状态通电和不通电,我们是不是能标记一下,那怎么标记呢,我们可以用0和1代表这两种状态是不是,那这群人通过大量的实践发现,可以通过8个开关通电与不通电来组成不同的状态,我们就可以表示世界上的万物了;我们说一个开关是不是有通电和不通电的两种状态,那么这群人就把这一个开关命名为一个“字节“,8个开关是不是就是8个字节,那每个字节的都有两种状态,那8位字节就可以组成2的8次方,256中不同的状态,在后来,这群人又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去,这个机器,就是最早的计算机,发明计算机的这群人是美国人,它们后来呢又把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了127号,这样计算机就可以用不同字节来存储英文的文字了。这些美国人看到这样,都自我感觉不错,它们就把这个方案叫做ASCII方案(方案的全称叫美国信息互换标准代码 American Standard Code for Information Interchange),当时世界所有的计算机都用同样的ASCII方案来保存英文文字,后来世界各地都开始使用计算机,但是很多国家用的不是英文,后来呢,随着计算机的世界性普及,为了可以在计算机保存各国的文字,一些人决定用127号之后的空位来表示这些新文字,就演变出了许许多多的编码方案,比如我们这次课要说的,utf8,latian1,GBK,等等,而这些就叫字符集;
好,那我们在做一下总结:由于计算机仅识别二进制数据,而且人类则更倾向于识别字符(符号),因此就需要一个二进制与字符的对应关系,这就是字符集。
(二)中文数据问题
好,前面我们把字符集是什么,它存在的意思是什么讲清楚了,接下来我们说说字符集能给我们解决什么问题-中文数据的问题,我们说中文数据问题的本质就是字符集的问题。
(二)MySQL表的字符集
一般来说,库的字符集是什么,表的字符集就是什么,当然MySQL服务器还有一个字符集,那么这个逻辑就是服务器的字符集是什么,库的字符集就是什么,库的字符集是什么,表的字符集就跟着是什么;
那怎么查看,我们当前状态下这些字符集都是什么呢?
-- 查看服务器端的基本信息
\s
- show 是查看东西的,我想查一下,创建demo数据库的那一刻,创建数据库详细的创建语句,表面上看我们创建demo数据库的SQL语句是create database demo;其实后面还有一些东西是系统自带的,默认的,我们看一下:
- show create database demo;
- 我们看到创建demo时后面是不是还跟着一些东西,default character set latin1是不是?这一串是什么意思呢?这一串的意思是demo的默认字符集被设置为latin1,我们说的这是库层面,我们在看看表层面:
- 前面jacky讲的创建数据表的SQL语句模型是什么,我们回忆一下:
--创建数据表的SQL语句模型
CREATE TABLE 表名称(
字段名1 数据类型 [属性]
字段名2 数据类型 [属性]
......
);
跟创建数据库一样,圆括号结尾我们后面还跟了默认的一些东西,这里jacky插一句额外的话,我们再看看我们创建数据表的SQL语句模型,是不是我们讲表补充的一直是围绕这个模型来讲的额,这个模型是不是就是jacky讲解的逻辑线,而这些是不是都是怎么创建数据表,说了这么多,是不是都是说的怎么创建表,那有朋友会说,jacky一个创建表就讲了这么多,没有必要吧,没必要讲什么数据类型,属性,索引吧,我直接创建一个表create tabel 表名(id int),不就可以了吗?那我会怎么跟你解释呢:还是借用开篇的话吧,学习是为了什么,为了实现梦想,财务自由是吧,MySQL跟其他的技能一样,都是细节决定成败,为什么有些人表面上看着能力,但是在细节的处理上差的太多,对于技术来讲,细节才是真正决定成败的,所以做的差不多的工作,有人一个月3000,有人一个月3万,就是这个道理,我们在细节上下了功夫,而这些细节是必要的,jacky才会去讲,像全文索引这样的知识点,食之无味,弃之可惜,jacky就让大家自学了;
好,我们言归正传,我们觉得上面SQL模型就结束了吗?其实还有ENGINE=InnoDB Default CHARSET=latin1,ENGINE=InnoDB什么意思?这张表是InooDB表引擎,表引擎是什么,下次课jacky会详细的说,这次课,大家只要记住:表引擎决定了你表里面存储数据是什么样的形态,记住这一句就够了,详细的jacky下次课会说,那么InnoDB,后面又跟了什么?Default charser=latin1,就是说我们在创建表的情况下,不强行设置表的字符集,我们MySQL是不是会给你默认一个字符集,
用latin1,没有好处,只有坏处。
MySQL开发者为瑞典MySQL AB公司,所以默认编码为latin1。
早期版本的编码都是latin1, latin1编码可以认为无字符格式的编码,什么字符都可以存,乱玛也可以存,至于里面是什么内容,只能靠客户端的程序来解释,这样你的程序里就莫名奇妙的要多了一个识别和转换编码的步骤。程序复杂度冤枉的增加了,性能也受影响。而且,在latin1编码中比较和排序都有问题。