文章目录
- 1. 字符集与字符集比较规则
- 2. 大小写规范
- 3. 默认数据库
- 4. 与文件系统相关
 
1. 字符集与字符集比较规则
MySQL有4个级别的字符集和比较规则,分别是
- 服务器级别
- 数据库级别
- 表级别
- 列级别
当创建对应表或列未指定字符集时,默认会取其上一级别的字符集
执行如下SQL语句:
SHOW variables LIKE '%character%';

- character_set_server: 服务器级别的字符集
- character_set_database: 当前数据库的字符集
- character_set_client: 服务器解码请求时使用的字符集
- character_set_connection: 服务器处理请求时会把请求字符串从character_set_client转为character_set_connection
- character_set_results: 服务器向客户端返回数据时使用的字符集
查看字符集默认比较规则:
SHOW charset;

上表中,MySQL版本一共支持41种字符集,其中的 Default collation 列表示这种字符集中一种默认的比较规则,里面包含着该比较规则主要作用于哪种语言,比如 utf8_polish_ci 表示以波兰语的规则比较 utf8_spanish_ci 是以西班牙语的规则比较,utf8_general_ci 是一种通用的比较规则
后缀表示该比较规则是否区分语言中的重音、大小写。具体如下:
| 后缀 | 英文释义 | 描述 | 
|---|---|---|
| _ai | accent insensitive | 不区分重音 | 
| _as | accent sensitive | 区分重音 | 
| _ci | case insensitive | 不区分大小写 | 
| _cs | case sensitive | 区分大小写 | 
| _bin | binary | 以二进制方式比较 | 
通常我们都是使用utf8_general_ci
说明1:
utf8_unicode_ci 和 utf8_general_ci 对中、英文来说没有实质的差别
utf8_unicode_ci 校对速度快,但准确度稍差
utf8_general_ci 准确度高,但校对速度较差
一般情况,用 utf8_general_ci 就够了,但如果应用中有德语、法语或者俄语,请一定使用 utf8_unicode_ci
说明2:
修改了数据库的默认字符集和比较规则后,原来创建的表的字符集和比较规则并不会改变,如果需要,那么需要单独修改
响应过程中编码解码的总结图:

2. 大小写规范
在MySQL中,windows系统默认大小写不敏感,但是 linux 系统是大小写敏感的
通过如下命令查看:
SHOW VARIABLES LIKE '%lower_case_table_names%'; -- linux 0; windows 1
- lower_case_table_names参数值的设置: 
  - Linux默认为0,大小写敏感
- 设置1,大小写不敏感。创建的表,数据库都是以小写形式存放在磁盘上,对于sql语句都是转换为小写对表和数据库进行查找
- 设置2,创建的表和数据库依据语句上格式存放,凡是查找都是转换为小写进行
 
两个平台上SQL大小写的区别具体来说:
- 数据库名、表名、表的别名、变量名是严格区分大小写的;
- 关键字、函数名称在SQL 中不区分大小写;
- 列名(或字段名)与列的别名(或段别名)在所有的情况下均是忽略大小写的
在MySQL 8下禁止在重新启动 MySQL 服务时将 lower_case_table_names 设置成不同于初始化 MySOL 服务时设置的 lower_case_table_names 值
PS:非大佬请不要尝试将windows的修改为0,作者已经因为想要这么操作导致不得不重装MySQL了
如果你的变量名命名规范没有统一,就可能产生错误。这里有一个有关命名规范的建议:
- 关键字和函数名称全部大写;
- 数据库名、表名、表别名、字段名、字段别名等全部小写:
- SQL 语句必须以分号结尾
3. 默认数据库
安装MySQL后,系统默认带的四个默认数据库
-  mysql MySQL 系统自带的核心数据库,它存储了MySQL的用户账户和权限信息,一些存储过程、事件的定义信息一些运行过程中产生的日志信息,一些帮助信息以及时区信息等 
-  information_schema 保存着MySQL服务器 维护的所有其他数据库的信息,比如有哪些表、哪些视图、哪些触发器、哪些列、哪些索引。这些信息并不是真实的用户数据,而是一些描述性信息,有时候也称之为元数据。在系统数据库information_schema中提供了一些以innodb_sys开头的表,用于表示内部系统表
-  performance_schema 主要保存MySQL服务器运行过程中的一些状态信息,可以用来 监控MySQL服务的各类性能指标。包括统计最近执行了哪些语句,在执行过程的每个阶段都花费了多长时间,内存的使用情况等信息
-  sys 主要是通过视图的形式把 information_schema和performance_schema结合起来,帮助系统管理员和开发人员监控 MySQL 的技术性能
4. 与文件系统相关
举例: 数据库a , 表b
1、如果表b采用 InnoDB,data\a中会产生1个或者2个文件:
- b.frm: 描述表结构文件,字段长度等
- 如果采用 系统表空间模式的,数据信息和索引信息都存储在ibdata1中
- 如果采用 独立表空间存储模式,data\a中会产生b.ibd文件(存储数据信息和索引信息)
此外
- MySQL5.7 中会在data\a的目录下生成 db.opt文件用于保存数据库的相关配置。比如: 字符集、比较规则。而MySQL8.0不再提供db.opt文件
- MySQL8.0中不再单独提供b.frm,而是合并在b.ibd文件中
2、如果表b采用MyISAM,data\a中会产生3个文件:
-  MySQL5.7 中: b.frm: 描述表结构文件,字段长度等MySQL8.0 中 b.xxx.sdi : 描述表结构文件,字段长度等 
-  b.MYD (MYData): 数据信息文件,存储数据信息(如采用独立表存储模式) 
-  b.MYI(MYIndex): 存放索引信息文件 


















