????二、数据库的存储引擎、数据类型以及约束条件????

存储引擎

Innodb

Innodb是MySQL 5.5版本以及之后的版本默认的存储引擎

MyISAM

MyISAM是MySQL 5.5之前的版本默认的存储引擎,速度要比Innodb快

BLACKHOLE

无论存什么,都立刻消失

MEMORY

因为是内存引擎,数据保存在内存中,因此断电数据丢失

# 查看数据库支持的存储引擎
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);

MySQL 5.6 不同的存储引擎创建的表

????二、数据库的存储引擎、数据类型以及约束条件????

MySQL 8.0 不同的存储引擎创建的表

在8之前,表结构和数据分别存放在frm和ibd文件中,但是到了8,就全部存放在了ibd文件中了

frm文件的信息及更多信息移动到序列化字典信息(Serialized Dictionary Information,SDI)中

????二、数据库的存储引擎、数据类型以及约束条件????

创建表的完整语法

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

# 注意事项
1、在同一张表中,字段名是唯一的
2、宽度和约束条件的是可选的,字段名和数据类型是必须的,而且约束条件可以写多个
3、最后一行不可以有“,”
4、语句的最后要“;”结束

# 宽度:一般情况下指的是对存储数据的限制??
create table t7 (name char); # char类型默认宽度是1
insert into t7 values (‘samuel‘); # 结果存的是s
insert into t7 values (‘nagase‘); # 结果存的是n
insert into t7 values (null); # 结果存的是null,为什么呢?因为null是关键字

# 5.6 版本默认没有开启“严格模式”,在存储数据的时候,规定只能存储1个字符给了多少个字符会进行截取
# 5.7 及更高版本默认开启“严格模式”,在存储数据的时候,一旦超出规定的字符数,就会报错:
ERROR 1406 (22001): Data too long for column ‘name‘ at row 1

# 因为5.7 及更高版本默认开启“严格模式”并且如果没有开启严格模式,数据库会对数据进行截取操作,这样就增加了数据库的工作量,因此要开启“严格模式“
# ??宗旨:能尽量少的让数据库干活就尽量少,不要给数据库添加额外的压力??

# 约束条件not null使得无法插入null
create table t7 (name char(8) not null);
insert into t7 values (null); # 无法插入,因为设置了not null非空约束

# 宽度和约束条件的关系
1、宽度是用来限制数据的存储
2、而约束条件是在宽度的基础上增加额外的约束

严格模式

# 查看严格模式命令
show variables like %mode;

模糊查询/匹配
  关键字:like
    %:匹配多个任意字符
    _:匹配单个任意字符

# 修改严格模式
set session  只对当前窗口有效
set global  全局有效

set global sql_mode = ‘STRICT_TRANS_TABLES‘;
修改完成后要重新登录

????二、数据库的存储引擎、数据类型以及约束条件????

????二、数据库的存储引擎、数据类型以及约束条件????

基本数据类型

整型

  • 分类
    • tinyint
    • smallint
    • mediumint
    • int
    • bigint
  • 作用
    • 存储年龄、等级、id、号码等

整型默认都是带有符号的,可以使用无符号约束unsigned来去掉符号

如果存储的数据超出类型的最大范围,则只存最大可接受值

数据宽度一般说来是对存储数据的限制,但是在整型中,宽度代表显示的位数

create table t8 (id int(8));
# 如果数字不足8位,则默认使用空格填充至8位;如果超出8位,则有几位就存几位(但是还是要遵守最大范围)

# 使用0填充
create table t9 (id int(8) unsigned zerofill);

总结:针对整型字段,无需指定宽度,因为默认宽度已经足够显示所有的数据了。

浮点类型

  • 分类
    • 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
    • varchar
# char
定长
char(4) 超过4个字符直接报错,不够4个用空格补全
缺点:浪费空间
优点:存取都很简单,直接按照固定的字符存取即可
# varchar 变长
varchar(4) 超过4个直接报错,不够4个有几个就存几个
缺点:存取较为麻烦
存的时候要先制作报头,取的时候也要先读取报头
优点:节省空间


create table t18 (name char(4));
create table t19 (name varchar(4));

insert into t18 values (‘s‘);
insert into t19 values (‘s‘);

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

 

时间类型

  • 分类
    • date---年月日2020-6-16
    • time---时分秒11:11:11
    • datetime---年月日时分秒2020-6-16 9:10:30
    • 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, ‘Sam, 1998, 1998-1-1, 11:11:11, 2020-6-16 11:11:11);

枚举与集合类型

  • 分类
    • 枚举(enum)多选一
    • 集合(set)多选多
# 具体使用
create table user (
   id int, 
   name varchar(16);
   gender enum(male, female, others);
   hobbies set(singing, dancing, reading, running) 
);

insert into user values (1, ‘samuel‘, ‘male‘, ‘singing, running‘); # ?

insert into user valuse (2, ‘nagase‘, ‘male‘, ‘xxx‘); # ? 集合可以写一个,但是不可以写集合内没有定义的
insert into user values (2, ‘nagase‘, ‘xxx‘, ‘singing, reading‘); # ? 枚举字段内的数据必须是枚举内定义好的

 

????二、数据库的存储引擎、数据类型以及约束条件????

上一篇:PHP和mysql基础


下一篇:Oracle连接Db2