存储引擎
文件格式很多,并且针对不同的文件格式会有对应不同的存储方式和处理机制。
针对不同格式的数据应该有不同的处理机制来存储。
存储引擎就是不同的处理机制
MySQL主要的存储引擎
innodb MySQL5.5版本及之后的存储引擎,存储数据更加的安全
myisam MySQL5.5版本之前的存储引擎,存储速度比innodb更快
memory 内存引擎(数据全部存放在内存当中,不能永久保存数据),断电数据丢失
blackhole 无论存什么,都立刻消失(黑洞)
# 查看所有的数据库存储引擎show engines;# 获得的内容如下:+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| Engine | Support | Comment | Transactions | XA | Savepoints |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL || MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO || MyISAM | YES | MyISAM storage engine | NO | NO | NO || BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO || CSV | YES | CSV storage engine | NO | NO | NO || MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO || ARCHIVE | YES | Archive storage engine | NO | NO | NO || InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES || PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
不同的存储引擎异同点
存储表
create table t1(id int) engine=innodb;create table t2(id int) engine=myisam;create table t3(id int) engine=memory;create table t4(id int) engine=blackhole;
存数据
insert into t1 values(1);insert into t2 values(1);insert into t3 values(1);insert into t4 values(1);select * from t1;select * from t2;select * from t3; # 服务端重启后数据消失select * from t4; # t4中查看不到数据
创建表的完整语法
# 语法create table 表名( 字段名1 类型(宽度)约束条件, 字段名2 类型(宽度)约束条件, 字段名3 类型(宽度)约束条件, 字段名4 类型(宽度)约束条件)# 注意 1、在同一张表中字段名不能相同 2、宽度和约束条件是可选的(可写可不写),而字段名和字段类型是必写的 约束条件支持多个 字段名1 类型(宽度)约束条件1 约束条件2..., 3、最后一行不能有逗号"""补充"""# 宽度 一般情况下指的是对存储数据的限制 create table t5(name char); # 默认宽度为1 insert into t5 values('json'); # 针对不同的版本会出现不同的效果哦 select * from t5; """ +------+ | name | +------+ | j | +------+ 1 row in set (0.00 sec) """ insert into t5 values(null); # 关键字null,能全部存入# MySQL 5.7之后的版本默认开启严格模式,规定存几个就只能存几个
约束条件1:null,not null 不能插入null
create table t6(id int,name char not null); # 宽度默认为1
insert into t6 values(1,'json'); # 数据写入成功!只将‘j’写进
insert into t6 values(2,null); # 报错:Column 'name' cannot be null
小结:
针对整型字段,括号内无需指定宽度。
浮点型
分类:FLOAT DOUBLE DECIMAL
作用:身高、体重、薪资
# 存储限制float(255,30); # 总共255位,小数部分占了30位double(255,30); # 总共255位,小数部分占了30位decimal(65,30); # 总共65位,小数部分占了30位#精确度验证create table t11(id float(255,30));create table t12(id double(255,30));create table t13(id decimal(65,30));insert into t11 values(1.111111111111111111111111111111);insert into t12 values(1.111111111111111111111111111111);insert into t13 values(1.111111111111111111111111111111);
小结:结合实际应用场景,选择合适的数据类型进行存储
字符类型
分类:CHAR VARCHAR(建议使用)
注:其实在实际生产中, 很多看似需要用整型或浮点型存储的数据内部可能都是用的字符类型存储。
CHAR: 定长 char(4) 数据超过4个字符报错,不够则空格补全VARCHAR: 变长 varchar(4) 数据超过4个字符报错,不够有几个存几个(比较节省空间) 取的时候需要制作报头,之后才能读取真实数据# 以前使用的一般是char类型,现在基本上使用的varchar类型create table t14(name char(4));create table t15(name varchar(4));insert into t14 values('h');insert into t15 values('h');# char_length:统计字段长度select char_length(name) from t14;select char_length(name) from t15;"""首先可以肯定的是char硬盘上存储的绝对是真正的数据,带有空格的数据,在显示的时候被MySQL自动剔除多余的空格"""# 取消自动剔除空格操作,再次修改sql_modeset global sql_mode = 'STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';# 实际上是替换的操作,所以在这里修改的时候注意将严格模式修改的代码加上
注意:
char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。 CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。 BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。 BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。 有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。 |
日期类型
date:年月日 2020-11-15datetime:年月日时分秒 2020-11-15 11:11:11time:时分秒 11:11:11Year:年 2020create table student( id int, name varchar(4), born_year year, birth date, study_time time, reg_time datetime);insert into student values(1,'张三','2020','2020-11-15','11:11:11','2020-11-15 11:11:11');
枚举和集合类型
分类:
枚举(enum):多选一
集合(set):多选多
# 基本使用create table user( id int, name varchar(4), gender enum('male','femal','others'));insert into user values(1,'张三','male');insert into user values(2,'李四','xxx'); # 报错:Data truncated for column 'gender' at row 1# 枚举字段 后期存储数据的时候只能从枚举里面选择一个存储create table teacher( id int, name char(4), gender enum('male','femal','others'), hobby set('read','music','sports','eating'));insert into teacher values(1,'李四','male','read');insert into teacher values(2,'老王','male','read,sports,music');# 集合 可以选一个或多个,但是不能选择集合里没有的内容,否则报错!
完