一、存储引擎
存储引擎就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方
法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和
操作此表的类型)
show engines; # 查看所有的存储引擎
engine=InnoDB; #创建表时写在后面,不写则默认值
#需要知道的四种存储引擎
MyISAM:
MySQL5.5及之前版本默认的存储引擎
存取数据的速度都非常快 但是功能较少安全性较低
InnoDB:
MySQL5.6及之后版本默认的存储引擎
存取数据速度没有MyISAM快 但是功能更多 安全性更高
事务 行锁 外键
BlackHole:
往里面写入的任何数据都会直接消失
Memory:
内存存储数据(临时的)
#使用时文件个数不一致
InnoDB
.frm 表结构
.ibd 表数据和索引(类似于书的目录)
MyISAM
.frm 表结构
.MYD 表数据
.MYI 索引(类似于书的目录)
BlackHole
.frm 表结构
Memory
.frm 表结构
二、MySQL 基本数据类型
2.1数值类型
2.1.1 整型
类型 |
大小 |
范围(有符号) |
范围(无符号) |
用途 |
TINYINT |
1 byte |
(-128,127) |
(0,255) |
小整数值 |
SMALLINT |
2 bytes |
(-32 768,32 767) |
(0,65 535) |
大整数值 |
MEDIUMINT |
3 bytes |
(-8 388 608,8 388 607) |
(0,16 777 215) |
大整数值 |
INT或INTEGER |
4 bytes |
(-2 147 483 648,2 147 483 647) |
(0,4 294 967 295) |
大整数值 |
BIGINT |
8 bytes |
(-9,223,372,036,854,775,808,9 223 372 036 854 775 807) |
(0,18 446 744 073 709 551 615) |
极大整数值 |
"""
如果不想让整型有符号 加 unsigned
create table t6(id tinyint unsigned);
针对整型字段 括号里面的数字不是用来限制存储长度而是用来控制展示长度
ps:如果不理解 直接记结论
定义整型字段无需自己写括号和数字
int
tinyint
create table t12(id int(4) zerofill);
insert into t12 values(1),(11111111);
"""
2.1.2 浮点型
类型 |
大小 |
范围(有符号) |
范围(无符号) |
用途 |
FLOAT |
4 bytes |
(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) |
0,(1.175 494 351 E-38,3.402 823 466 E+38) |
单精度 浮点数值 |
DOUBLE |
8 bytes |
(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) |
0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) |
双精度 浮点数值 |
DECIMAL |
对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 |
依赖于M和D的值 |
依赖于M和D的值 |
小数值 |
"""
精确度不一样
float < double < decimal
在实际开发中 很多时候看似需要用数字存储的数据
其实我们可能都是使用的字符串存储,如:手机号
"""
2.2 日期类型
类型 |
大小 ( bytes) |
范围 |
格式 |
用途 |
DATE |
3 |
1000-01-01/9999-12-31 |
YYYY-MM-DD |
日期值 |
TIME |
3 |
'-838:59:59'/'838:59:59' |
HH:MM:SS |
时间值或持续时间 |
YEAR |
1 |
1901/2155 |
YYYY |
年份值 |
DATETIME |
8 |
1000-01-01 00:00:00/9999-12-31 23:59:59 |
YYYY-MM-DD HH:MM:SS |
混合日期和时间值 |
TIMESTAMP |
4 |
1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 |
YYYYMMDD HHMMSS |
混合日期和时间值,时间戳 |
2.3 字符串类型
类型 |
大小 |
用途 |
CHAR |
0-255 bytes |
定长字符串 |
VARCHAR |
0-65535 bytes |
变长字符串 |
char(4):最大存储四个字符 超出了直接报错 不超过空格填充至四位
优点:整存整取 速度快
缺点:浪费硬盘空间
varchar(4):最大存储四个字符 超出了直接报错 不超过有几位存几位
优点:节省硬盘空间
缺点:速度没有char快
create table t10(id int,name char(4));
create table t11(id int,name varchar(4));
insert into t10 values(1,'lzlnb');
insert into t11 values(1,'lzlnb');
# 具体还得查看配置的sql_mode 严格模式
字符类型对比
2.4 枚举与集合
枚举:enum 多选一
create table t14(
id int,
name char(16),
gender enum('male','female','others')
);
集合:set 多选多(多选一)
create table t15(
id int,
name char(32),
hobby set('read','study','music','tea')
);
三、严格模式
# 查看sql_mode
show variables like '%mode%';
# 修改
set global sql_mode='strict_trans_tables';
# 退出客户端重新进入即可
# 验证是否自动填充
set global sql_mode='pad_char_to_full_length';
四、创建表的完整语法
create table 表名(
字段名1 字段类型(宽度) 约束条件,
字段名2 字段类型(宽度) 约束条件,
字段名3 字段类型(宽度) 约束条件
)
"""
1.字段名和字段类型是必须的 宽度和约束条件是可选的
2.约束条件可以有多个
字段名1 字段类型(宽度) 约束条件1 约束条件2 约束条件3
3.最后一个字段结尾不能加逗号
"""