MySQL存储引擎、基本数据类型
MySQL存储引擎、基本数据类型
存储引擎
MySQL内部针对数据的存储有很多种不同的方式
我们把这些不同的存储方式叫做不同的存储引擎
如何查看各类存储引擎:
show engines;
主要存储引擎:
InnoDB
MySQL5.5之后的版本默认的存储引擎
支持事务、行锁、外键 >>> 数据更安全
"""
事务:保证多个数据的操作要么全部完成要么全部失败
行锁:多一行行数据加锁 同一时间只能有一个人操作
外键:建立表关系(后面详细的讲)
"""
MyISAM
MySQL5.5之前的版本默认的存储引擎
不支持事务、外键等功能 >>> 安全性较于InnoDB低
但是存取数据的速度比InnoDB快
memory
数据直接存储在内存 速度快但是断电立刻丢失
blackhole
可以理解为黑洞,写入其中的数据都会丢失
存储引擎表文件
# 不同的存储引擎生成的文件数目也不同
1.InnoDB有两个文件
.frm 表结构
.idb 表数据、索引(书的目录)
2.MyISAM有三个文件
.frm 表结构
.MYD 表数据
.MYI 表索引
3.memory 有一个文件
.frm 表结构
4.blackhole 有一个文件
.frm 表结构
存储数据特征
创建表的完整语法
create table 表名(
字段名 字段类型(宽度) 约束条件,
字段名 字段类型(宽度) 约束条件,
字段名 字段类型(宽度) 约束条件
) ;
"""
1.字段名和字段类型是必须的 宽度和约束条件是可选的
2.约束条件可选 并且一个字段可支持多个约束条件
3.最后结尾的字段语句不能有逗号
"""
字段类型
整型:
tinyint
smallint
int
bigint
'''不同整型能够存储的数字范围不同'''
# 所有的整型都是自带正负号的
'''我们可以通过实验来验证'''
create table t6(id tinyint);
insert into t6 values(-129),(256);
# 可以通过unsigned约束条件(无符号)
create table t7(id tinyint unsigned);
insert into t7 values(-129),(256);
浮点型:
float
double
decimal
"""不同的浮点型存储小数的范围和精确度不一样"""
float(255,30) # 总共255位小数位占30位
double(255,30) # 总共255位小数位占30位
decimal(65,30) # 总共65位小数位占30位
精确度:
float < double < decimal
"""
精确度问题在很多场景下都会发生 有时候我们会采取不同的类型来存储
eg:
比如手机号全部是数字存储的时候应该使用整型 但是有时候我们使用字符类型
"""
字符类型:
char
varchar
"""上述两个数据类型在存储数据上有本质的区别"""
char(4)
最多可以存储4个字符 超过了报错,没有超过也按照四个字符来存储(默认空格填充)
varchar(4)
最多可以存储4个字符 超过了报错 , 没有超过则按照实际几个字符来存
# char_length() 统计数据长度
默认情况下MySQL会自动填充存储并在查询的时候自动去除填充的空格
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
5.6超出了范围没有报错是因为我们没有开启严格模式(5.7及之后版本默认都有)
思考题:char 和varchar 如何选择?
char
好处:整存整取 速度快
坏处:浪费存储空间
varchar
好处:节省存储空间
坏处:存取速度较于char慢
# 存取数据都需要计算 消耗时间
# 结论:两者都有应用场景 需要结合实际情况分析决定
严格模式
# 查看严格模式
show variables like '%mode%';
# 修改严格模式
set global sql_mode = 'strict_trans_tables';
# 只需要退出客户端重新进入即可
修改严格模式:set global sql_mode = 'strict_trans_tables';
时间类型
date 年月日 time 时分秒 Datetime 年月日时分秒 Year 年 # 简单演示 create table student( id int, name char(16), born_year year, birth date, study_time time, reg_time datetime ); insert into student values(1,'jason','2022','2022-05-09','11:11:00','2022-11-11 11:11:11');
枚举与集合类型
enum:多选一
set :多选多
枚举类型
create table t13(
id int,
name varchar(16),
gender enum('male','female','others')
);
'''插入数据的时候只能够插入提前规定好的'''
insert into t13 values(1,'jason','男'); 报错
insert into t13 values(2,'tony','male');
集合类型
create table t14(
id int,
name char(16),
hobby set('basketball','football','doublecolorball')
);
'''插入数据的时候只能够插入提前规定好的'''
insert into t14 values(1,'jason','read'); 报错
insert into t14 values(2,'kevin','basketball'); 可选一
insert into t14 values(3,'tony','basketball,football'); 可选多
宽度说明
int(4) char(4)
# 针对数字类型 宽度并不是用来限制存储长度而是用来表示展示长度
"""
以后在定义数字的时候无需手动添加宽度
"""
约束条件
"""
插入数据两种方式
1.insert into t1 values() 按照字段顺序依次传入(一个都不能少)
2.insert into t1(id,name) values() 按照指定的字段传入(可以少)
"""
unsigned 无符号
zerofill 0填充
not null:
# 不能为空 使用频率很高
create table t18(
id int,
name varchar(16) not null
);
default:默认值
create table t19(
id int,
name varchar(16) default '匿名用户'
);
unique : 唯一
'''单列唯一'''
create table t20(
id int,
name varchar(16) unique
);
'''多列唯一'''
create table t21(
id int,
host int,
port int,
unique(host,port)
);