存储引擎
Innodb
Innodb是MySQL 5.5版本以及之后的版本默认的存储引擎
MyISAM
MyISAM是MySQL 5.5之前的版本默认的存储引擎,速度要比Innodb快
BLACKHOLE
无论存什么,都立刻消失
MEMORY
因为是内存引擎,数据保存在内存中,因此断电数据丢失
# 查看数据库支持的存储引擎
show engines;
# 不同的存储引擎在存储表的时候异同点
create table t1 (id int) engine = innodb;
create table t2 (id int) engine = myisam;
create table t3 (id int) engine = blackhole;
create table t4 (id int) engine = memory;
# 存数据
insert into t1 values (1);
insert into t2 values (1);
insert into t3 values (1);
insert into t4 values (1);
MySQL 5.6 不同的存储引擎创建的表
MySQL 8.0 不同的存储引擎创建的表
在8之前,表结构和数据分别存放在frm和ibd文件中,但是到了8,就全部存放在了ibd文件中了
创建表的完整语法
# 语法 create table 表名 ( 字段名1 数据类型(宽度) 约束条件1 约束条件2, 字段名2 数据类型(宽度) 约束条件1 约束条件2, 字段名3 数据类型(宽度) 约束条件1 约束条件2 );
# 注意事项
1、在同一张表中,字段名是唯一的
2、宽度和约束条件的是可选的,字段名和数据类型是必须的,而且约束条件可以写多个
3、最后一行不可以有“,”
4、语句的最后要“;”结束
# 宽度:一般情况下指的是对存储数据的限制??
create table t7 (name char); # char类型默认宽度是1
insert into t7 values (‘samuel‘); # 结果存的是s
insert into t7 values (‘nagase‘); # 结果存的是n
insert into t7 values (null); # 结果存的是null,为什么呢?因为null是关键字
# 5.6 版本默认没有开启“严格模式”,在存储数据的时候,规定只能存储1个字符给了多少个字符会进行截取
# 5.7 及更高版本默认开启“严格模式”,在存储数据的时候,一旦超出规定的字符数,就会报错:ERROR 1406 (22001): Data too long for column ‘name‘ at row 1
# 因为5.7 及更高版本默认开启“严格模式”并且如果没有开启严格模式,数据库会对数据进行截取操作,这样就增加了数据库的工作量,因此要开启“严格模式“
# ??宗旨:能尽量少的让数据库干活就尽量少,不要给数据库添加额外的压力??
# 约束条件not null使得无法插入null
create table t7 (name char(8) not null);
insert into t7 values (null); # 无法插入,因为设置了not null非空约束
# 宽度和约束条件的关系
1、宽度是用来限制数据的存储
2、而约束条件是在宽度的基础上增加额外的约束
严格模式
# 查看严格模式命令 show variables like ‘%mode‘;
模糊查询/匹配
关键字:like
%:匹配多个任意字符
_:匹配单个任意字符
# 修改严格模式
set session 只对当前窗口有效
set global 全局有效
set global sql_mode = ‘STRICT_TRANS_TABLES‘;
修改完成后要重新登录
基本数据类型
整型
- 分类
- tinyint
- smallint
- mediumint
- int
- bigint
- 作用
- 存储年龄、等级、id、号码等
整型默认都是带有符号的,可以使用无符号约束unsigned来去掉符号
如果存储的数据超出类型的最大范围,则只存最大可接受值
数据宽度一般说来是对存储数据的限制,但是在整型中,宽度代表显示的位数
create table t8 (id int(8));
# 如果数字不足8位,则默认使用空格填充至8位;如果超出8位,则有几位就存几位(但是还是要遵守最大范围)
# 使用0填充
create table t9 (id int(8) unsigned zerofill);
总结:针对整型字段,无需指定宽度,因为默认宽度已经足够显示所有的数据了。
浮点类型
- 分类
- float
- double
- decimal
- 作用
- 身高、体重、薪资等
# 存储限制
float(255, 30) # 总共255位,小数部分占用30位
double(255, 30) # 总共255位,小数部分占用30位
decimal(65, 30) # 总共65位,小数部分占用30位
# 精确度不同
create table t15 (id float(255, 30));
create table t16 (id double(255, 30));
create table t17 (id decimal(65, 30));
insert into t15 values (1.111111111111111111111111111111);
insert into t16 values (1.111111111111111111111111111111);
insert into t17 values (1.111111111111111111111111111111);
精确度:float < double < decimal
字符类型
- 分类
- char
- varchar
# char 定长
char(4) 超过4个字符直接报错,不够4个用空格补全
缺点:浪费空间
优点:存取都很简单,直接按照固定的字符存取即可
# varchar 变长
varchar(4) 超过4个直接报错,不够4个有几个就存几个
缺点:存取较为麻烦
存的时候要先制作报头,取的时候也要先读取报头
优点:节省空间
create table t18 (name char(4));
create table t19 (name varchar(4));
insert into t18 values (‘s‘);
insert into t19 values (‘s‘);
select char_length(name) from t18;
select char_length(name) from t19;
首先可以肯定的是 char硬盘上存的绝对是真正的数据,带有空格的,但是在显示的时候MySQL会自动将多余的空格剔除
可以修改sql_mode让MySQL不进行自动剔除
set global sql_mode = ‘STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH‘;
时间类型
- 分类
- date---年月日2020-6-16
- time---时分秒11:11:11
- datetime---年月日时分秒2020-6-16 9:10:30
- Year---年份2020
create table student( id int, name varchar(16), born_year year, birth date, study_time time, reg_time datetime ); insert into student values (1, ‘Sam‘, ‘1998‘, ‘1998-1-1‘, ‘11:11:11‘, ‘2020-6-16 11:11:11‘);
枚举与集合类型
- 分类
- 枚举(enum)多选一
- 集合(set)多选多
# 具体使用 create table user ( id int, name varchar(16); gender enum(‘male‘, ‘female‘, ‘others‘); hobbies set(‘singing‘, ‘dancing‘, ‘reading‘, ‘running‘) );
insert into user values (1, ‘samuel‘, ‘male‘, ‘singing, running‘); # ?
insert into user valuse (2, ‘nagase‘, ‘male‘, ‘xxx‘); # ? 集合可以写一个,但是不可以写集合内没有定义的
insert into user values (2, ‘nagase‘, ‘xxx‘, ‘singing, reading‘); # ? 枚举字段内的数据必须是枚举内定义好的