一、存储引擎
存储引擎就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方
法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和
操作此表的类型)
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.最后一个字段结尾不能加逗号
"""