45-mysql-存储引擎、数据类型、约束条件

今日内容概要

  • 存储引擎

  • 数据类型

    整型

    浮点型

    字符类型

    日期类型

    枚举与集合类型

  • 约束条件

今日内容详细

存储引擎

日常生活中文件格式有很多中,并且针对不同的文件格式会有对应不同存储方式和处理机制(txt,pdf,word,mp4...)

针对不同的数据应该有对应的不同的处理机制来存储

存储引擎就是不同的处理机制

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 t2 values(1);
insert into t3 values(1);
insert into t4 values(1);
"""

创建表的完整语法

# 语法
create table 表名(
  字段名1 类型(宽度) 约束条件,
    字段名2 类型(宽度) 约束条件,
    字段名3 类型(宽度) 约束条件
)

# 注意
1 在同一张表中字段名不能重复
2 宽度和约束条件是可选的(可写可不写) 而字段名和字段类型是必须的
	约束条件写的话 也支持写多个
    字段名1 类型(宽度) 约束条件1 约束条件2...,
	create table t5(id);  报错
3 最后一行不能有逗号
	create table t6(
        id int,
        name char,
    );   报错

"""补充"""
# 宽度
	一般情况下指的是对存储数据的限制
  create table t7(name char);  默认宽度是1
    insert into t7 values('jason');
    insert into t7 values(null);  关键字NULL
    	针对不同的版本会出现不同的效果
          5.6版本默认没有开启严格模式 规定只能存一个字符你给了多个字符,那么我会自动帮你截取
            5.7版本及以上或者开启了严格模式 那么规定只能存几个 就不能超,一旦超出范围立刻报错 Data too long for ....
"""严格模式到底开不开呢?"""
MySQL5.7之后的版本默认都是开启严格模式的
使用数据库的准则:
	能尽量少的让数据库干活就尽量少 不要给数据库增加额外的压力

# 约束条件 null  not null不能插入null
create table t8(id int,name char not null);

"""
宽度和约束条件到底是什么关系
	宽度是用来限制数据的存储
	约束条件是在宽度的基础之上增加的额外的约束
"""

基本数据类型

整型

  • 分类

    TINYINT SMALLINT MEDUIMINT INT BIGINT

  • 作用

    存储年龄、等级、id、号码等等

"""
以TINYINT 
	是否有符号
		默认情况下是带符号的
	超出会如何
		超出限制只存最大可接受值
"""
create table t9(id tinyint);
insert into t9 values(-129),(256);

# 约束条件之unsigned 无符号
create table t10(id tinyint unsigned);


create table t11(id int);
# int默认也是带符号的  
# 整型默认情况下都是带有符号的

# 针对整型 括号内的宽度到底是干嘛的
create table t12(id int(8));
insert into t12 values(123456789);

"""
特例:只有整型括号里面的数字不是表示限制位数
id int(8)
	如果数字没有超出8位 那么默认用空格填充至8位
	如果数字超出了8位 那么有几位就存几位(但是还是要遵守最大范围)
"""
create table t13(id int(8) unsigned zerofill);
# 用0填充至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位
    
    # 精确度验证
    create table t15(id float(255,30));
    create table t16(id double(255,30));
    create table t17(id decimal(65,30));
    """你们在前期不要给我用反向键 所有的命令全部手敲!!!增加熟练度"""
    
    insert into t15 values(1.111111111111111111111111111111);
    insert into t16 values(1.111111111111111111111111111111);
    insert into t17 values(1.111111111111111111111111111111);
    
    float < double < decimal
    # 要结合实际应用场景 三者都能使用
    

字符类型

  • 分类

    """
    char
    	定长
    	char(4)	 数据超过四个字符直接报错 不够四个字符空格补全
    varchar
    	变长
    	varchar(4)  数据超过四个字符直接报错 不够有几个存几个
    """
    create table t18(name char(4));
    create table t19(name varchar(4));
    
    insert into t18 values('a');
    insert into t19 values('a');
    
    # 介绍一个小方法 char_length统计字段长度
    select char_length(name) from t18;
    select char_length(name) from t19;
    """
    首先可以肯定的是 char硬盘上存的绝对是真正的数据 带有空格的
    但是在显示的时候MySQL会自动将多余的空格剔除
    """
    
    # 再次修改sql_mode 让MySQL不要做自动剔除操作
    set global sql_mode = 'STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';
    

    char与varchar对比

    """
    char
    	缺点:浪费空间
    	优点:存取都很简单
    		直接按照固定的字符存取数据即可
    		jason egon alex wusir tank 
    		存按照五个字符存 取也直接按照五个字符取
    
    varchar
    	优点:节省空间
    	缺点:存取较为麻烦
    		1bytes+jason 1bytes+egon 1bytes+alex 1bytes+tank 
    
    		存的时候需要制作报头
    		取的时候也需要先读取报头 之后才能读取真实数据
    
    以前基本上都是用的char 其实现在用varchar的也挺多
    """
    
    补充:
        进来公司之后你完全不需要考虑字段类型和字段名
        因为产品经理给你发的邮件上已经全部指明了
    

时间类型

  • 分类

    date:年月日 2020-5-4

    datetime:年月日时分秒 2020-5-4 11:11:11

    time:时分秒11:11:11

    Year:2020

    create table student(
    	id int,
        name varchar(16),
        born_year year,
        birth date,
        study_time time,
        reg_time datetime
    );
    insert into student values(1,'egon','1880','1880-11-11','11:11:11','2020-11-11 11:11:11');
    

枚举与集合类型

  • 分类

    """
    枚举(enum)  多选一
    集合(set)   多选多
    """
    
  • 具体使用

    create table user(
    	id int,
        name char(16),
        gender enum('male','female','others')
    );
    insert into user values(1,'jason','male');  正常
    insert into user values(2,'egon','xxxxooo');  报错
    # 枚举字段 后期在存数据的时候只能从枚举里面选择一个存储 
    
    
    create table teacher(
    	id int,
        name char(16),
        gender enum('male','female','others'),
        hobby set('read','DBJ','hecha')
    );
    insert into teacher values(1,'jason','male','read');  正常
    insert into teacher values(2,'egon','female','DBJ,hecha');  正常
    insert into teacher values(3,'tank','others','生蚝'); 报错
    # 集合可以只写一个  但是不能写没有列举的

作业

  • 整理今日内容到笔记
  • 设计的所有命令全部用手敲一遍,不要使用方向键

每日测验

  • 你都了解哪些MySQL存储引擎,简单说说它们的特点
  • 创建表的完整语法及注意事项
  • MySQL基本数据类型有哪些

内容回顾

  • 存储引擎

    """
    针对不同的数据应该有不同的处理机制
    
    查看MySQL所有的存储引擎
    show engines;
    
    Innodb
    	MySQL5.5版本之后默认的存储引擎
    	支持事务 行锁 外键    数据更加的安全
    	创建表会生成两个文件
    		表结构文件
    		表数据文件
    MyIsam
    	MySQL5.5版本之前的默认的存储引擎
    	它虽然在数据安全上没有Innodb可靠 但是查询速度上较Innodb更快
    	创建表会生成三个文件
    		表结构文件
    		表数据文件
    		表索引文件
    memory
    	内存引擎
    	临时数据存储 
    	创建表会生成一个文件
    		表结构文件
    blackhole
    	黑洞
    	创建表会生成一个文件
    		表结构文件
    """
    
  • 创建表的完整语法

    # 语法
    create table 表名(
    	字段名1 字段类型(宽度) 约束条件,
        字段名2 字段类型(宽度) 约束条件,
        字段名3 字段类型(宽度) 约束条件
    )
    # 注意
    1 在同一张表中字段名不能重复
    2 宽度和约束条件是可选的 字段名和字段类型是必须的
    3 最后一个字段后面不能加逗号
    
    
    # 宽度一般情况下是对存储数据的限制
    # 约束条件可以有多个 是额外的限制
    
  • 严格模式

    # 使用数据库的时候 应该尽量让数据库少干活!!!
    
    show variables like '%mode';
    
    set session
    set global sql_mode = 'STRICT_TRANS_TABLES';
    
  • 基本数据类型

    """
    整型
    	TINYINT INT BIGINT
    	默认都是有符号的
    
    	int(4)
    	针对整型括号内的数字并不是用来限制存储的
    	不够四位默认用空格填充
    	够四位有几位存几位 
    
    	zerofill
    
    	总结 以后在定义整型字段的时候 其实都不需要自己加宽度
    	因为整型都自带宽度 完全足够展示所有的数字
    
    
    浮点型
    	float(255,30)
    	double(255,30)
    	decimal(65,30)
    	只要是浮点型 括号后面有两个数字
    		第一个数字表示的总位数
    		第二个数字表示的小数位
    
    	精确度
    	float < double < decimal
    
    	扩展:其实在实际生产中 很多看似需要用整型或者浮点型存储的数据
    	内部可能都是用的字符类型存储
    
    字符类型
    	char(4)  定长
    		只能存储最大四个字符 超出报错 不超默认用空格补全
    	varchar(4)  变长
    		只能存储最大四个字符 超出报错 不超有几个存几个
    
    	char Vs varchar
    	char
    		浪费空间
    		存取方便 简单暴力 直接按照固定的位数存取即可
    
    	varchar
    		节省空间
    		但是相较于char 它的存取速度较慢
    			因为它在存取数据的时候需要有一个 报头
    
    	以前用char很多 限制varchar很多
    
    时间类型
    	date  年月日
    	datetime  年月日时分秒
    	time  时分秒
    	year  年(有范围限制)
    
    枚举与集合类型
    	枚举enum
    		多选一  
    	集合set
    		多选多(也可以单选)
    	gender enum('male','female','others')
    	hobby set('read','sangna','DBJ','hecha')
    	你的数据只能来源于字段提供的选择项 不能凭空捏造
    """
    
  • 约束条件

    """
    zerofill
    unsigned
    not null
    """
posted @ 2020-07-05 13:37  电竞杰森斯坦森  阅读(164)  评论(0编辑  收藏  举报