从MySQL 8.0开始,mysql系统表和数据字典表使用InnoDB存储引擎,存储在MySQL数据目录下的mysql.ibd表空间文件中。在MySQL 5.7之前,这些系统表使用MyISAM存储引擎,存储在mysql数据库文件目录下各自的表空间文件中。关于数据库存储引擎的详细内容,请关注本书的姊妹篇《剑指MySQL——架构、调优与运维》。
(1)在MySQL 5.7中查看系统表类型,结果如下。
(2)在MySQL 8.0中查看系统表类型,结果如下。
系统表全部换成事务型的InnoDB表,默认的MySQL实例将不包含任何MyISAM表,除非手动创建MyISAM表。
在计算机的世界里只有二进制0和1,为了让计算机可以直接识别人类文字,就产生出了字符集编码表的概念。字符集编码表就是将人类的文字和数字对应表格内字符,将十进制数字转换为二进制数字就简单多了。世界上第一张字符集编码表是ASCII(American Standard Code for Information Interchange,美国标准信息交换码)表,但是它只能表示128个字符,包括英文字母、数字、英文标点符号等。例如,a对应97,A对应65等。在计算机流行到世界各地后,人们逐渐发现,ASCII字符集里的128个字符已经不再满足他们的需求了。所以,陆续出现了很多字符集。如latin1,gbk,utf8等。在8.0版本之前,MySQL默认的字符集为latin1,而8.0版本默认的字符集为utf8mb4。
latin1是ISO-8859-1的别名,有些环境下写作latin-1。ISO-8859-1编码是单字节编码,不支持中文等多字节字符,但向下兼容ASCII,其编码范围是0x00-0xFF、0x00-0x7F之间完全和ASCII一致、0x80-0x9F之间是控制字符、0xA0-0xFF之间是文字符号(这里0x开头的数字是十六进制表示方式,关于进制知识读者可以关注尚硅谷教育公众号搜索相关视频进行学习)。
MySQL中utf8字符集是utf8mb3的别称,使用三个字节编码表示一个字符。自MySQL 4.1版本被引入,能够支持绝大多数语言的字符,但依然有些字符不能正确编码,如emoji表情字符等,为此MySQL 5.5引入了utf8mb4字符集。在MySQL 5.7对utf8mb4进行了大幅优化,并丰富了校验字符集。mb4就是“most byte 4”的意思,专门用来兼容四字节的Unicode,utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。如果原来某些库和表的字符集是utf8,可以直接修改为utf8mb4,不需要做其他转换。
(1)使用SHOW语句查看MySQL 5.7数据库的默认编码。
(2)使用SHOW语句查看MySQL 8.0数据库的默认编码。
字符集校对规则是在字符集内用于字符比较和排序的一套规则,如有的规则区分大小写,有的则无视。校对规则特征如下。
· 两个不同的字符集不能有相同的校对规则。
· 每个字符集有一个默认的校对规则。
· 校对规则存在命名约定,以其相关的字符集名开始,中间包括一个语言名,并且以_ci、_cs或_bin结尾。其中_ci表示大小写不敏感、_cs表示大小写敏感、bin表示直接比较字符的二进制编码,即区分大小写。
使用SHOW语句查看utf8mb4字符集的部分校对规则如下。