MySQL存储引擎、基本数据类型

存储引擎

MySQL内部针对数据的存储有很多种不同的方式
我们把这些不同的存储方式叫做不同的存储引擎

如何查看各类存储引擎:

show engines;

mysql 存储INTERVAL类型 mysql存储数据格式_约束条件

主要存储引擎:

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 表结构

mysql 存储INTERVAL类型 mysql存储数据格式_约束条件_02

存储数据特征

mysql 存储INTERVAL类型 mysql存储数据格式_约束条件_03

 

 

 

mysql 存储INTERVAL类型 mysql存储数据格式_约束条件_04

创建表的完整语法

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);

mysql 存储INTERVAL类型 mysql存储数据格式_数据_05

 

mysql 存储INTERVAL类型 mysql存储数据格式_存储引擎_06

浮点型:

float
double
decimal
"""不同的浮点型存储小数的范围和精确度不一样"""

float(255,30)  # 总共255位小数位占30位
double(255,30)  # 总共255位小数位占30位
decimal(65,30)  # 总共65位小数位占30位

mysql 存储INTERVAL类型 mysql存储数据格式_数据_07

 

 

mysql 存储INTERVAL类型 mysql存储数据格式_数据_08

  精确度:

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及之后版本默认都有)

mysql 存储INTERVAL类型 mysql存储数据格式_约束条件_09

  思考题:char 和varchar 如何选择?

char
    好处:整存整取 速度快
    坏处:浪费存储空间
varchar
    好处:节省存储空间
    坏处:存取速度较于char慢
        # 存取数据都需要计算 消耗时间


# 结论:两者都有应用场景 需要结合实际情况分析决定

严格模式

# 查看严格模式
    show variables like '%mode%';
# 修改严格模式
    set global sql_mode = 'strict_trans_tables';
# 只需要退出客户端重新进入即可
修改严格模式:set global sql_mode = 'strict_trans_tables';

mysql 存储INTERVAL类型 mysql存储数据格式_存储引擎_10

时间类型

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');

mysql 存储INTERVAL类型 mysql存储数据格式_数据_11

 


 

mysql 存储INTERVAL类型 mysql存储数据格式_数据_12

 

集合类型

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
);

mysql 存储INTERVAL类型 mysql存储数据格式_mysql 存储INTERVAL类型_13

 

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)
);

 

mysql 存储INTERVAL类型 mysql存储数据格式_mysql 存储INTERVAL类型_14