存储引擎
- 不同的数据应该有不同的处理机制来存储
- 存储引擎就是不同的处理机制
MySQL主要存储引擎
- innodb
是MySQL5.5版本之后默认的存储引擎,支持事务、行锁、外键 - myisam
是MySQL5.5版本之前默认的存储引擎,速度比innodb快,但不够其安全 - memory
内存引擎(数据全部存放在内存中)断电数据丢失,临时存储 - blackhole
无论存什么,都立刻消失(黑洞),部署功能 - 查看所有引擎
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 t1 values(1);
insert into t1 values(1);
创建表的完整语法
- 语法
create table 表名(
字段名1 类型(宽度) 约束条件,
字段名2 类型(宽度) 约束条件,
字段名3 类型(宽度) 约束条件
)
- 注意
1、在同一张表中字段名不能重复
2、宽度和约束条件是可选的(可写可不写)而字段名和字段类型是必须的
约束条件写的话,也支持写多个
字段名1 类型(宽度) 约束条件1 约束条件2...,
create table t5(id); 报错
3、最后一行不能有逗号 - 补充
1、宽度:一般指对存储数据的限制,默认宽度为1
针对不同版本会有不同效果:5.6版本默认不开启严格模式,规定只能存一个字符却给了多个字符,自动截取;
5.7版本及以上默认开启严格模式,规定只能存一个字符却给了多个字符,超出范围会报错Data too long for...
2、约束条件: null not null不能插入null
关系:宽度是用来限制数据的存储,约束条件是在宽度的基础之上增加的额外的约束
基本数据类型
整型
- 分类
- 作用
存储年龄、等级、id、号码等 - TINYINT
是否有符号?
默认情况下是带符号的
超出范围会如何?
超出限制只存最大可接受值 - 约束条件:unsigned,zerofill
- id int(8) : 如果数字没有超出8位,那么默认用空格填充至8位;
如果数字超出了8位,那么有几位就存几位(但是还是遵守最大范围) - 总结:
针对整形字段,括号内无需指定宽度,因为它默认的宽度已经足够显示所有的数据
严格模式
- 如何查看严格模式
show variables like "%mode";
模糊匹配/查询
关键字 like
%:匹配任意多个字符
_ :匹配任意单个字符 - 修改严格模式
set session #只在当前窗口有效
set global #全局有效
set global sql_mode = 'STRICT_TRANS_TABLES';
修改完之后,重新进入服务端即可
浮点型
- 分类
FLOAT、DOUBLE、DECIMAL - 作用
身高、体重、薪资等 - 存储限制
float(255, 30) # 总共255位,小数部分占30位
double(255, 30) # 总共255位,小数部分占30位
decimal(65, 30) # 总共65位,小数部分占30位 - 精确度验证
float < double < decimal
字符类型
- 分类
char:定长,char(4),数据超过四个字符直接报错,不够四个字符空格补全
varchar:变长,varchar(4),数据超过四个字符直接报错,不够有几个存几个 - char_length 统计字段长度
- char硬盘上存的真正数据是带有空格的,但在显示时MySQL会自动将多余的空格剔除
- 修改sql_mode,让MySQL不要自动剔除操作
set global sql_mode = 'STRICT_TRANS_TABLES, PAD_CHAR_TO_FULL_LENGTH' - varchar存的时候需要制作报头,取的时候也先读取报头,之后才能读取真是数据
- 建议使用varchar,节省空间
时间类型
- 分类
date:年月日
datetime:年月日时分秒
time:时分秒
Year:年份
枚举与集合类型
- 分类
枚举(enum):多选一
集合(set):多选多 - 特点
枚举字段,后期在存数据的时候只能从枚举里面选择一个存储
集合可以只写一个或写多个,但不能写没有列举的