MFDYCS's Blog - MySQL
type: channel
link: https://mfdycs.cn/category/MySQL/
items: MySQL安全管理
items: MySQL多表操作
items: MySQL高级操作
items: MySQL数据库设计规范
items: MySQL数据库字段详解
items: MySQL数据库字符集
items: MySQL基本操作

MySQL安全管理
type: item
date: 2021-02-26T20:22:00+08:00
description: 目录： 一、外键约束 1、外键 2、外键约束 3、外键管理 新增外键 删除外键 二、事务安全 1、事务 2、事务处理 3、事务特点 三、预处理 1、预处理 2、预处理传参 四、视图 1、视图 2、视图管理 视图查看 视图修改：修改视图逻辑 视图删除 3、视图数据操作 4、视图算法 五、数据备份与还原 1、表数据备份 2、表数据还原 3、文件备份 步骤 示例 4、文件还原 5、SQL备份 6、SQL还原 7、总结 六、用户管理 1、账号管理 2、权限管理 3、角色管理 一、外键约束 1、外键 外键：foreign key，表中指向外部表主键的字段定义成外键 外键必须要通过语法指定才能称之为外键 [constraint外键名] foreign key(当前表字段名) references 外部表(主键字段) 外键构成条件 外键字段必须与对应表的主键字段类型一致 外键字段本身要求是一个索引（创建外键会自动生成一个索引） 【例】创建专业表和学生表，学生表中的专业id指向专业表id create table t_47 ( id int primary key auto_increment, name varchar(50) not null unique )charset utf8mb4; create table t_48 ( id int primary key auto_increment, name varchar(50) not null, c_id int, constraint `c_id` foreign key(c_id) references t_47(id) )charset utf8mb4; 外键可以不指定名字，系统会自动生成 create table t_49 ( id int primary key auto_increment, name varchar(50) not null, c_id int, foreign key(c_id) references t_47(id) )charset utf8mb4; 2、外键约束 外键约束：当表建立外键关系后，外键就会对主表（外键指向的表）和子表（外键所在的表）里的数据产生约束效果 外键约束的是写操作（默认操作） 新增：子表插入的数据对应的外键必须在主表存在 修改：主表的记录如果在子表存在，那么主表的主键不能修改（主键不能修改） 删除：主表的记录如果在子表存在，那么主表的主键不能删除 外键约束控制：外键可以在定义时控制外键的约束作用 控制类型 on update：父表更新时子表的表现 on delete：父表删除时子表的表现 控制方式 cascade：级联操作，父表操作后子表跟随操作 set null：置空操作，父表操作后，子表关联的外键字段置空 restrict：严格模式，不允许父表操作（默认的） no action：子表不管 外键约束增强了数据的安全性和可靠性，但是会增加程序对于数据的不可控性，所以是实际开发中一般会通过程序逻辑控制来保证数据的完整性和安全性，外间使用较少 【例1】子表不能插入主表不存在的数据 insert into t_48 values(null,'Tony',2); # 错误 insert into t_47 values(null,'English'); insert into t_48 values(null,'Peny',1); 【例2】默认的外键产生后，主键不能更新被关联的主键字段或者删除被关联的主键记录 # 错误 update t_47 set id = 2; delete from t_47 where id = 1; 【例三】限制外键约束，一般使用更新级联，删除置空 on update cascade：更新级联 on delete set null：删除置空 create table t_50( id int primary key auto_increment, name varchar(50) not null unique )charset utf8; create table t_51( id int primary key auto_increment, name varchar(50) not null, c_id int, # 如果要允许置空，就不能not null foreign key(c_id) references t_50(id) on update cascade on delete set null )charset utf8; insert into t_50 values(null,'Chinese'),(null,'Computer'); insert into t_51 values(n…

MySQL多表操作
type: item
date: 2021-02-25T20:19:00+08:00
description: 目录： 一、联合查询 1、联合查询 2、联合查询排序 二、连接查询 1、交叉连接 2、内连接 3、外连接 4、自然连接 5、using 关键字 三、子查询 1、标量子查询 2、 列子查询 3、行子查询 4、表子查询 6、exists 子查询 7、比较方式 一、联合查询 1、联合查询 联合查询：union，是指将多个查询结果合并成一个结果显示 联合查询是针对查询结果的合并（多条select语句合并） 联合查询要求：联合查询是结果联合显示 多个联合查询的字段结果数量一致 联合查询的字段来源于第一个查询语句的字段 查询选项：union默认是去重的，想要保留全部查询结果，需要使用union all all：保留所有记录 distinct：保留去重记录（默认） select 查询[字段名字] union 查询选项 select 查询 ... 【例】创建一个表同t_40，并插入数据，联合查询 create table t_42 like t_40; insert into t_42 values(null,'犬夜叉','男',200,'神妖1班'), (null,'日暮戈薇','女',16,'现代1班'), (null,'桔梗','女',88,'法师1班'), (null,'弥勒','男',28,'法师2班'), (null,'珊瑚','女',20,'法师2班'), (null,'七宝','保密',5,'宠物1班'), (null,'杀生丸','男',220,'神妖1班'), (null,'铃','女',4,'现代1班'), (null,'钢牙','男',68,'神妖1班'), (null,'奈落','男',255,'神妖1班'), (null,'神乐','女',15,'神妖2班'); 使用联合查询将两张表的数据拼接到一起显示 select * from t_40 union select * from t_42; # 联合查询选项默认是distinct select * from t_40 union all select * from t_42; 联合查询不要求字段类型一致，只对数量要求一致，而且字段与第一条查询语句相关 select name from t_40 union all select age from t_40; 注意：如果数据不能对应，那么查询没有意义 如果使用where对数据进行筛选，where针对的是select指令，而不是针对union结果 select * from t_40 union all select * from t_42 where gender = '女'; 注意：where只针对第二条select有效；若要全部有效，需要select都使用where 2、联合查询排序 联合查询排序：针对联合查询的结果进行排序 order by本身是对内存结果进行排序，union的优先级高于order by，所以order by默认是对union结果进行排序 如果想要对单独select的结果进行排序，需要两个步骤 将需要排序的select指令进行括号包裹（括号里使用order by） order by必须配合limit才能生效（limit一个足够大的数值即可） 【例】将t_40和t_42表的结果使用年龄降序排序 select * from t_40 union all select * from t_42 order by age desc; 【例】t_40表按年龄降序排序，t_42表按年龄升序排序 # 无效方式 (select * from t_40 order by age desc) union (select * from t_42 order by age); # 正确方式 (select * from t_40 order by age desc limit 99999) union (select * from t_42 order by age limit 99999); 二、连接查询 连接查询：join，将两张表依据某个条件进行数据拼接 join左右各一张表：join关键字左边的表叫左表，右边的表叫右表 连接查询的结果都是记录会保留左右表的所有字段（字段拼接） 具体字段数据依据查询需求确定 表字段冲突需要使用表别名和字段别名区分 不同的连表有不同的连接方式，对于结果的处理也不尽相同 连接查询不限定表的数量，可以进行多表连接，只是表的连接需要一个一个的连（A join B join C ...） 1、交叉连接 交叉连接：cross join，不需要连接条件的连接 交叉连接产生的结果就是笛卡尔积 左表的每一条记录都会与右表的所有记录连接并保留 交叉连接没有实际数据价值，只是丰富了连接查询的完整性 【例…

MySQL高级操作
type: item
date: 2021-02-24T20:16:00+08:00
description: 目录： 一、数据新增 1、批量插入 2、蠕虫复制 3、主键冲突 二、数据查询 1、查询选项 2、字段选择&别名 3、数据源 4、where 语句 5、运算符 6、group by 语句 7、回溯统计 8、分组排序 9、having 子句 10、order by 子句 11、limit 子句 12、总结 三、数据更新 四、数据删除 1、限制删除 2、清空数据 一、数据新增 1、批量插入 批量插入：是一种优化数据逐条插入的方式 MySQL8 以后默认有事务安全，即批量要么都成功要么都失败，不会出现部分问题 全字段批量插入 insert into 表名 values(值列表1),(值列表2),...,(值列表N); 部分字段批量插入（注意字段默认值） insert into 表名 (字段列表) values(值列表1),(值列表2),...,(值列表N); 2、蠕虫复制 蠕虫复制：从已有表中复制数据直接插入到另外一张表（同一张表） 蠕虫复制的目标是快速增加表中的数据 实现表中数据复制（用于数据备份或者迁移） 实现数据的指数级递增（多用于测试） insert into 表名[(字段列表)] select 字段列表 from 表名; 注意事项 字段列表必须对应上 字段类型必须匹配上 数据冲突需要事先考虑 【例】创建一张新表，将t_30表中的数据迁移到新表中 create table t_35( id int primary key auto_increment, stu_name varchar(20) not null, course varchar(20) not null, score decimal(5,2) )charset utf8; insert into t_35 select * from t_30; # 快速让t_35表中的数据达到超过100条（重复执行） insert into t_35 (stu_name,course,score) select stu_name,course,score from t_35; 3、主键冲突 主键冲突：在数据进行插入时包含主键指定，而主键在数据表已经存在 主键冲突的业务通常是发生在业务主键上（业务主键本身有业务意义） 主键冲突的解决方案 忽略冲突：保留原始记录 insert ignore into 表名 [(字段列表)] values(值列表); 冲突更新：冲突后部分字段更新 insert into 表名 [(字段列表)] values(值列表) on duplicate key update [字段 = 新值...]; 冲突替换：先删除原有记录，后新增记录 效率没有insert高：需要检查是否冲突 replace into 表名 [(字段列表)] values(值列表); 【例1】用户名作为主键的用户注册（冲突不能覆盖） create table t_36( username varchar(50) primary key, password char(32) not null, regtimr int unsigned not null )charset utf8mb4; insert into t_36 values('username','password',12345678); # 冲突忽略 insert ignore into t_36 values('username','12345678',12345678); 【例2】用户名作为主键的记录用户使用信息（不存在新增、存在则更新时间） create table t_37( username varchar(50) primary key, logintime int unsigned )charset utf8; insert into t_37 values('username',12345678); # 冲突更新（替换部分字段数据） insert into t_37 values('username',12345678) on duplicate key update logintime = unix_timestamp(); # 当前时间戳 【例3】用户名作为主键的记录用户使用信息（不存在新增、存在则更新全部） create table t_38( username varchar(50) primary key, logintime int unsigned, clientinfo varchar(255) not null )charset utf8; insert into t_38 values('username',unix_timestamp(),'{PC:chrome}'); # 替换插入 rep…

MySQL数据库设计规范
type: item
date: 2021-02-23T20:15:00+08:00
description: 目录： 一、关系型数据库设计范式 1、第一范式 1NF 2、第二范式 2NF 3、第三范式 3NF 4、BCNF 5、逆规范化 二、表关系 1、一对一关系 2、一对多关系 3、多对多关系 一、关系型数据库设计范式 范式：Normal Format，符合某一种级别的关系模式的集合，表示一个关系内部各属性之间的联系的合理化程度 范式目标是在满足组织和存储的前提下使数据结构冗余最小化，用来减少数据冗余 范式级别越高，表的级别就越标准 各种范式之间的关系：$5NF \subset 4NF \subset BCNF \subset 3NF \subset 2NF \subset 1NF$ 1、第一范式 1NF 第一范式：1NF，关系中每一分量不可再分。数据字段设计时必须满足原子性 满足1NF 的关系称为规范化的关系 如果数据使用的时候需要进行拆分那么就违背1NF 1NF是满足数据表设计的最基础规范 示例 设计一张学生选修课成绩表 学生 性别 课程 教室 成绩 学习时间 张三 男 PHP 101 100 2月1日,2月28日 李四 女 Java 102 90 3月1日,3月31日 张三 男 Java 102 95 3月1日,3月31日 当前表的学习时间在使用的时候肯定是基于开始时间和结束时间的，而这种设计就会存在使用时的数据拆分，不满足原子性也就是1NF 满足1NF的设计：字段颗粒度应用层最小（不需要拆分） 学生 性别 课程 教室 成绩 开始时间 结束时间 张三 男 PHP 101 100 2月1日 2月28日 李四 女 Java 102 90 3月1日 3月31日 张三 男 Java 102 95 3月1日 3月31日 2、第二范式 2NF 第二范式：若R∈1NF，且每个非主属性完全函数依赖于码，则称R∈2NF 2NF的定义要求消除非主属性对码的部分依赖。 部分依赖：首先表存在复合主键，其次有的字段不是依赖整个主键，而只是依赖主键中的一部分 部分依赖解决：让所有非主属性都依赖一个候选关键字 最简单方式：取消复合主键（一般选用逻辑主键替代，但是本质依然是复合主键做主），所有非主属性都依赖主属性（逻辑主键） 正确方式：将部分依赖关系独立成表 示例 学生成绩表中学生和课程应该是决定性关系，因此属于主属性（主键） 学生（P） 性别 课程（P） 教室 成绩 开始时间 结束时间 张三 男 PHP 101 100 2月1日 2月28日 李四 女 Java 102 90 3月1日 3月31日 张三 男 Java 102 95 3月1日 3月31日 成绩是由学生和课程决定的，是完全依赖主属性 性别只依赖学生（部分依赖） 教室、开始时间和结束时间依赖课程（部分依赖） 解决方案：将学生信息维护到一张表，课程信息维护到一张表，成绩表取两个表的主属性即可 学生表 Stu_id（P） 姓名 性别 1 张三 男 2 李四 女 Stu_id是姓名的代指属性（逻辑主键，本质主键是姓名） 性别只依赖主属性 课程表 Class_id（P） 课程 教室 开始时间 结束时间 1 PHP 101 2月1日 2月28日 2 Java 102 3月1日 3月31日 Class_id是课程的代指属性（逻辑主键） 教室、开始时间和结束时间都依赖课程（主属性） 成绩表 Stu_id（P） Class_id（P） 成绩 1 1 100 2 2 90 1 2 95 Stu_id和Class_id共同组成主属性（复合主键） 成绩依赖Stu_id和Class_id本身，不存在部分依赖 3、第三范式 3NF 第三范式：3NF，关系模式 $R<U,F>$ 中，若不存在这样的码 $X$，属性组 $Y$ 及非主属性 $Z(Z \nsubseteq Y)$，使得 $X \to Y(Y \nrightarrow X), Y \to Z$ 成立 3NF的定义要求消除非主属性对码的传递依赖 传递依赖：字段某个非主属性不直接依赖主属性，而是通过依赖某个其他非主属性而传递到主属性之上 传递依赖解决：让依赖非主属性的字段与依赖字段独立成表 示例 学生表：包括所在系信息 学号（P） 姓名 专业编号 专业名字 1 张三 0001001 软件工程 2 李四 0001002 土木工程 姓名和专业编号都依赖于学号（为学号提供信息支持） 专业名字依赖专业编号（为编号提供信息支持） 专业名字间接依赖学号：传递依赖 随着学生增加，专业名字会出现大量数据冗余 解决方案：将存储传递依赖部分的字段（非主属性）独立成表，然后在需要使用相关信息的时候，引入即可 专业表 专业编号（P） 专业名字 0001001 软件工程 0001002 土木工程 即使有更多的信息为专业提供支持也不存在传递关系 学生表 学号（P） 姓名 专业编号 1 张三 000…

MySQL数据库字段详解
type: item
date: 2021-02-22T20:10:00+08:00
description: 目录： 一、字段类型 1、整数类型 2、显示宽度 3、小数类型 浮点型 定点型 4、字符串类型 定长型 变长型 文本字符串 枚举 集合 5、时间日期类型 年 时间戳 日期 日期时间 时间 6、总结 二、属性 1、NULL属性 2、Default属性 3、主键 4、自增长属性 5、唯一键 6、comment 属性 三、数据库记录长度 一、字段类型 字段类型：MySQL中用来规定实际存储的数据格式 字段类型在定义表结构的时候设定 设定好字段类型后，插入数据时必须与字段类型对应；否则数据错误 字段类型作用：强制规范录入的数据格式，保证数据的有效性 MySQL有四大数据类型：整数类型、小数类型、字符串类型、时间日期类型 1、整数类型 MySQL中为了数据空间的有效使用，设定了五种整数类型： 迷你整形：tinyint，使用1个字节存储整数（-128~127） 短整型：smallint，使用2个字节存储整数 中整型：mediumint，使用3个字节存储整数 标准整型：int，使用4个字节存储整数 大整型：bigint，使用8个字节存储整数 数值型类型在MySQL中默认是有符号的，即有正负：无符号需要使用unsigned修饰整型，即纯正数 【例1】设计一个表记录个人信息：年龄、头发数量 # 年龄：没有负数，正常年龄也不超过200岁，迷你整型无符号即可 # 头发数量：没有负数，大概在几百万根，所以标准整型无符号即可 create table t1( age tinyint unsigned, # unsigned修饰整数，表示无符号（从0开始） haircount int unsigned )charset utf8mb4; 【例2】设计一个表记录4S店的汽车销量信息：库存数量、销量、采购量 # 4S店经常是先卖后进货，所以库存可能为负数，一个店铺的库存数通常不会太多，那么小整型即可 # 销量通常全国一个月也就几万台，所以基本上小整型就够了，但是为了保证后续可能存在的爆发，那么中整型也是绝对够了的，而且不会是负数 # 采购通常是正向采购，所以不会出现负数，而采购数量与销量持平就好 create table t2( stock smallint, sales mediumint unsigned, purchase mediumint unsigned )charset utf8; 2、显示宽度 显示宽度：int(L)，整数在数据库中显示的符号（数字+符号）个数 显示宽度并不表示存储长度，是用来填充显示位的 例如tinyint(3)，如果实际值是8，如果列指定了zerofill，查询后显示的结果就是008，左侧是用0来填充的。 显示宽度包含符号（如果允许为负数，-负号会增加一个宽度） 显示宽度可以主动控制：创建字段时加括号确定 显示宽度不会影响类型能表示的最大数值 可以通过zerofill让不够宽度的数值补充到对应宽度：在字段类型后使用zerofill 有符号和无符号对应的宽度不一样 create table t1( a tinyint, b tinyint unsigned )charset utf8; 可以主动控制显示宽度 alter table t1 add c tinyint(2) unsigned; 显示宽度不影响数据的大小 # 小于显示宽度 insert into t1 values(1,1,1); # 大于显示宽度 insert into t1 values(100,100,100); 可以通过zerofill让小于显示宽度的数值前置补充0到显示宽度 # 0填充只能针对正数 alter table t1 add d tinyint(2) zerofill; insert into t1 values(1,1,1,1); 3、小数类型 浮点型 浮点数：float/double，存储不是特别精确的数值数据 浮点数又称之为精度数据，分为两种 单精度：float，使用4个字节存储，精度范围为6-7位有效数字 双精度：double，使用8个字节存储，精度范围为14-15位有效数字 浮点数超过精度范围会自动进行四舍五入 精度可以指定整数和小数部分 默认不指定，整数部分不超过最大值，小数部分保留2位 可以指定：float/double(总长度,小数部分长度) 可以使用科学计数法插入数据：AEB，A * 10 ^ B 【例】记录商品的价格 create table t_11( goods_name varchar(20), goods_price float )charset utf8; insert into t_11 values('Nokia3310',199.99); insert into t_11 values('Nokia6100'…

MySQL数据库字符集
type: item
date: 2021-02-21T20:07:00+08:00
description: 目录： 一、字符集 1、字符集概念 数据存储 数据读取 2、MySQL字符集 数据库内部对象字符集原理 客户端存储数据原理 客户端读取数据原理 总结 3、乱码问题解决 4、字符集设置原理 二、校对集 1、校对集概念 2、校对集设置 3、校对集应用 一、字符集 1、字符集概念 字符集：charset或者character set，是各种文字和符号在计算机中的总称 字符集根据不同国家的符号不同，有不同的字符集 不同的字符集占用的存储空间不一样，存储的底层也不一样 不同字符集之间可以进行转换 字符集是指定字符的存储和读取的规范 指定的字符集存储需要使用对应的字符集读取 错误的字符集存储或者读取都会产生乱码 常见字符集： ASCII：美国信息交换标准码，一般英文符号，一个字节存储 latin1：拉丁文字符集，一个字节存储，ISO-8859-1的别名 ，能够向下兼容ASCII GB2312：信息交换用汉字编码字符集 ，是中国1981年的一套国标规范，2个字节存储 GBK：汉字内码扩展规范（1995年），两个字节表示表示（汉字很多超过5000个） Unicode：万国码（统一码），使用统一的编码方式来解决传统的局限，1994年出现 UTF-8：8-bit Unicode Transformation Format（万国码） ，针对Unicode的可变长度字符编码，采用1-6个字节编码Unicode字符（目前通用编码规则）。建议使用UTF-8字符集进行数据存储（MySQL8中建议使用 utf8mb4 ） 数据存储 graph LR A(输入符号 A)-->B[计算机存储] B-->C{字符集选择} C-->|ASCII|D[转码 01000001] C-->|GBK|E[转码 0000000001000001] C-->|ASCII 存储中文|G[转码 乱码] D-->F((存储)) E-->F G-->F 数据读取 graph LR A(数据读取)-->B{字符集选择} B-->|ASCII|C[读1个字节 01000001] B-->|GBK|D[读2个字节 0000000001000001] B-->|UTF-8|G[读3个字节 错误读取] G-->H[解析 乱码] C-->E[解析 A] D-->E E-->F((输出)) H-->F 2、MySQL字符集 MySQL字符集：MySQL内部对于数据实际存储的字符集（服务器端） MySQL内部对象可以在各个层级设置字符集 MySQL内部对象存在字符集继承：==字段== → ==表== → ==数据库== → ==DBMS== MySQL内部内嵌支持几乎所有主流字符集 数据存储的最终字符集由字段控制 客户端与服务器进行交互时，需要明确告知服务器客户端自己的字符集（数据格式） 查看MySQL支持的字符集： show charset; 数据库内部对象字符集原理 graph LR A(服务器 数据管理)-->B[DBMS系统 安装配置字符集] B-->C[数据库 设定字符集] C-->|继承 DBMS字符集|B C-->D[数据表 设定字符集] D-->|继承 数据库字符集|C D-->E[数据字段 设定字符集] E-->|继承 数据表字符集|D 1、服务端存储的数据最终字符集由字段确定 2、字段通常不会设置字符集，继承表的字符集（统一性，真正一般都与数据库一致） 3、数据存储的字符集与客户端的字符集没有直接关系，是由表（字段）决定 客户端存储数据原理 graph LR A(客户端录入数据 数据自带字符集)-->B[发送服务端] A-->|提前告知数据字符集 否则使用默认设置|C B-->C C[服务端 接收数据]-->D[执行 存储操作] D-->E[转码为 目标字符集] E-->F((存储)) 客户端读取数据原理 graph LR A(客户端录入 获取指令)-->B[发送服务端] A-->|提前告知数据字符集 否则器使用默认设置|C B-->C[服务器 接收请求] C-->D[执行获取指令 按照本身字符集获取] D-->E[转成客户端 字符集数据] E-->F[返回客户端] F-->G(客户端解析 只按照自己的 字符集解析) 总结 1、MySQL服务端数据存储的字符集依赖各个对象设置 DBMS：设置最广，一旦设置所有对象都可以依赖，但是优先级最低 DB：针对数据库内的所有表，优先级高于DBMS，可以继承DBMS（一般在数据库层设置） Table：针对当前表的设置，优先级高于DB，可以继承DB Field：针对当前字段设置，优先级高于Table，可以继承Table，优先级最高 2、通常字符集的设置都是围绕数据表（现在都在数据库层），不会到具体字段 3、建议使用UTF8字符集存储数据（MySQ…

MySQL基本操作
type: item
date: 2021-02-20T20:06:00+08:00
description: 目录： 一、MySQL语法规则 二、MySQL库操作 1、创建数据库 2、显示数据库 基本语法 显示部分 显示数据库的创建语句 3、使用数据库 4、修改数据库 5、删除数据库 三、SQL表（字段）操作 1、创建数据表 2、显示数据表 3、查看数据库 4、更改数据表 修改表名 修改表选项 5、更改字段 新增字段 字段位置 更改字段名 修改字段 6、删除字段 四、SQL数据操作 1、新增数据 2、查看数据 3、更新数据 4、删除数据 一、MySQL语法规则 SQL是一种结构化编程语言 基础SQL指令通常是以行为单位 SQL指令需要语句结束符，默认是英文分号：;、\g、\G \G：主要用于查询数据，立体展示结果 SQL指令类似自然语言 编写的SQL中如果用到了关键字或者保留字，需要使用反引号````来包裹，让系统忽略 二、MySQL库操作 1、创建数据库 create database 数据库名 [数据库选项]; 库选项：数据库的相关属性 字符集： charset/charaacter set 字符集 ，代表当前数据库下所有表存储的数据默认指定的字符集（默认为DBMS默认选项） 校对集： collate 校对集 ，字符集和校对规则是一对多的关系，每个字符集至少对应一个校对规则，MySQL 支持 39 种字符集的将近 200 种校对规则。 create database db_1 charset utf8Mb4 collate utf8mb4_general_ci; 数据库名字建议使用 _ 方法，而不是驼峰法命名 2、显示数据库 每当用户通过SQL指令创建一个数据库，那么系统就会产生一个对应的数据库文件夹 Linux下默认路径为： /var/lib/mysql （数据库配置文件： usr/share/mysql ） MySQL8以前每个数据库文件夹下都有一个opt文件，保存的都是数据库选项 基本语法 show databases; information_schema —— 保存数据库所有的结构信息（表、库） mysql —— 核心数据库：负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息 performance_schema —— 效率库：用于收集存放数据库的性能参数 sys —— 帮助DBA和开发人员解释性能模式收集的数据的对象 显示部分 show databases like '匹配模式'; 匹配模式： _ ：匹配当前位置单个字符 % ：匹配指定位置多个字符 -- 获取以my开头的全部数据库 show databases like 'my%'; -- 获取m开头，中间为任意字符，最后为database的数据库 show databases like 'm%database'; 显示数据库的创建语句 show create database 数据库名称; 注：看到的指令并不是原始指令 3、使用数据库 use 数据库名; 4、修改数据库 指修改数据库的相关库选项 不能修改数据库名称（MySQL 5.5以后不能用 rename 指令） 如果想要修改数据库名字：新增 -> 迁移 -> 删除 数据库修改有两个部分：字符集、校对集 alter database [数据库名] [库选项]; 数据库名称可以忽略，此时语句对应于默认数据库 -- 修改数据库字符集 alter database db_1 charset gbk; -- 修改数据库校对集（必须同时改变字符集） alter database db_1 charset gbk collate gbk_chinese_ci; 5、删除数据库 drop database 数据库名字; 三、SQL表（字段）操作 1、创建数据表 create table [数据库名.]表名 ( 字段名 字段类型, ... 字段名 字段类型 ) 表与字段不分家，相辅相成 表的创建需要指定存储的数据库 明确指定数据库：数据库.表名 先使用数据库：use 数据库名字 字段至少需要指定名字、类型 数据库表不限定字段数量 每个字段间使用逗号,分隔 最后一个字段不需要逗号 表可以指定表选项（都有默认值） 存储引擎：engine [=] 具体存储引擎 字符集：[default] charset 具体字符集（继承数据库） 校对集：collate（继承数据库） create table db_1.t1( name varchar(50), age int, gender varchar(10) ); create table t2( name varchar(50) )engine Innodb charset utf8MB4; 存储引擎是指数据存储和管理的方式，MySQL中提供了多种存储引擎，一般使…