MySQL的存储引擎,数据类型的实际操作
- 存储引擎
- 创建表的完整语法
- 数据类型
- 字段的约束条件
存储引擎
什么是存储引擎
MySQL内部针对数据的存储有不同的方式
数据库的存储方式就是存储引擎
查看搜索引擎
![]()
主要存储引擎
innoDB
MySQL5.5之后的版本默认的存储引擎
特点:
支持事务、行锁、外键
安全性高
'''
事务:用于保证多个数据的操作能全部完成或失败
行锁:在每行的同一时间,只能有一个人操作
外键:建立表与表之间的关系
'''
myisam
MySQL5.5之前版本默认的存储引擎
特点:
不支持事务、外键等功能
安全性比innoDB低
存取速度比innoDB快
memory:
数据直接存储在内存
特点:
速度快
断电立刻丢失
blackhole:
性能如其名,写入的数据会丢失
存储引擎表文件
语法:
create table 表名(id int,内容 类型)engine=innoDB;
![]()
不同存储引擎的文件数目也不同
![]()
innoDB:
.frm 表结构
.idb 表数据、索引(类似于目录)
myisam:
.frm 表结构
.myd 表数据
.myi 表索引
memory:
.frm 表结构
blackhole:
.frm 表结构
存储数据特性
innorDB:
insert into r1 values(1);
![]()
myisam:
insert into r2 values(1);
![]()
blackhole:
insert into r4 values(1);
![]()
memory:
insert into r3 values(1);
![]()
![]()
创建表的完整语法
语法:
create table 表名(
字段名 数据类型(宽度)约束条件,
字段名 数据类型(宽度)约束条件
);
'''
1.字段名和数据类型是必须的,宽度和约束条件可选
2.约束条件可选,且一个字段可以有多个约束条件
3.最后结尾字段语句不能有逗号
'''
数据类型
整形
tinyint
smallint
int
bigint
'''不同整形存储的数字范围不同'''
![]()
![]()
浮点型
float
double
decimal
'''不同的浮点型小数范围不同和精度不一样'''
float(255,30) # 占255位,小数占30位
double(255,30) # 占255位,小数占30位
decimal(65,30) # 占65位,小数占30位
create table r6(id float(255,30));
create table r7(id double(255,30));
create table r8(id decimal(65,30));
insert into r8 values(1.11111111111111111);
insert into r7 values(1.11111111111111111);
insert into r6 values(1.11111111111111111);
![]()
# 精确度:float< double < decimal
字符型
char
varchar
char(x):
最多可以存储x个字符,在严格模式下,操过了报错,没有超过时默认空格填充空余
varchar(x):
最多可以存储x个字符,超过报错,没有超过时不用空格填充空余
eg:
create table r9(id int,name char(4));
create table r10(id int ,name varchar(4));
insert into r9 values(1,'jjjjj'); # 改版为5.6,因在5.7版本之前没有开启严格模式,所以没有报错
![]()
# char_length()
默认情况下char会自动填充存储并在查询的时候自动去除空格
eg:
insert into r9 values(1,'g');
insert into r10 values(1,'g');
# 设置严格模式(需要重启客户端)
set gloabl sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
![]()
![]()
思考
char:
优点:存取速度快
缺点:浪费存储空间
varchar:
优点:节省存储空间
缺点:存取速度慢
# varchar在存储数据时,会空出一字节计算字符长度没所以慢
'''
结论:两者各有相应的使用场合,要取长补短
'''
补充:严格模式
# 查看严格模式
show variables like '%mode%';
![]()
# 修改严格模式(需要退出客户端重新登录生效)
set global sql_mode = 'strict_trans_tables';
时间类型
date 年以日
time 时分秒
Datatime 年月日时分秒
year 年
# 针对时间的数据一般为自动获取
eg:
create table people(
id int,
name char(16),
born year,
birth date,
study time,
reg_time datetime
);
insert into student values(1,'jjj','1980','1980-1-12','2:4:0','1980-1-12 2:4:0');
![]()
枚举与集合类型
enum
多选一
# 枚举类型
create table en1(
id int,
name varchar(16),
gender enum('male','female','other')
);
# 插入数据的时候只能够插入提前规定好的
insert into t13 values(1,'jj','animals'); # 报错
![]()
set
多选多(包含多选一)
# 集合类型
create table s1(
id int,
name char(16),
hobby set('basketball','football','doublecolorball')
);
insert into s1 values(1,'jj','play'); # 报错
![]()
insert into s1 values(1,'jj','baseball'),(2,'zz','baseball,football');
![]()
宽度说明
int(x) char(x)
# 针对数字类型 宽度并不是用来限制存储长度而是用来表示展示长度
'''
以后在定义数字,不需手动添加宽度
'''
约束条件
'''
插入数据两种方式:
# 按照字段顺序依次传入(一个都不能少)
1.insert into 表名 values()
# 按照指定的字段传入(可以少)
2.insert into 表名 values()
'''
unsigned #无符号
语法:
create table 表名 (
元素名 数据类型 unsigned
);
eg:
create table v1(id int unsigned);
![]()
zerofilll # 0填充
语法:
create table 表名 (
元素名 数据类型 zerofill
);
eg:
create table v2(id int(5) zerofill);
insert into v2 values(2);
![]()
# default 默认值
语法:
create table 表名(
id int,
元素名 字符类型(16) default '字符内容'
);
eg:
create table v3(
id int,
name varchar(16) default 'kk'
);
insert into v3(id) values(2);
![]()
not null # 不能为空(使用频率高)
语法:
create table 表名(
id int,
字符名 字符类型 not null
);
eg:
create table v4(
id int,
char varchar(16) not null
);
insert into v4 values(1,null); # 报错
insert into v4 values(1,''); # 不报错
![]()
# unique 唯一
'''单列唯一'''
语法:
create table 表名(
id int,
字符名 字符类型 unique
);
eg:
create table v5(
id int,
char varchar(16) unique
);
insert into v5 values(1,'kk');
insert into v5 values(2,'kk'); # 报错
![]()
'''多列唯一'''
create table 表名(
id int,
元素1 int,
元素2 int,
unique(元素1,元素2)
);
eg:
create table v6(
id int,
host int,
port int,
unique(host,port)
);
insert into v6 values(1,2,3);
insert into v6 values(2,2,3); # 报错
![]()
约束条件与数据类型的关系
字段类型是用来约束存储数据的类型(广泛)
约束条件是基于字段类型之上的额外限制(局部)