【一】存储引擎
- 在平常我们处理的文件格式有很多,并且针对不同的文件格式会有对应不同的存储方式和处理机制
- 针对不同的数据应该有对应不同的处理机制
- 存储引擎就是不同的处理机制。
# 查看所有引擎
show engines;
四种主要的存储引擎
(1)Innodb
引擎
- 是MySQL5.5版本之后的默认存储引擎
- 支持事务/行锁/外键
(2)myisam
引擎
- 是MySQL5.5版本之前的默认存储引擎
- 速度比innodb快,但是数据安全较弱
(3)memory
引擎
- 内存引擎
- 数据全部存放在内存中
- 存储速度快,但是断电数据丢失
(4)blackhole
引擎
- 黑洞引擎
- 无论存什么都会立刻消失
【二】MySQL主要的存储引擎特点
- 利用不同的引擎创建表,向表中插入数据比较每一种引擎的特点
【1】建表语句
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;
【2】innodb引擎
-
t1.frm
-
- 存储表结构
-
t1.ibd
-
- 存储表数据
-
特点:存储数据持久化,即使断开连接也存在
【3】myisam引擎
-
t2.frm
-
- 表结构
-
t2.MYD
-
- 表数据
-
t2.MYI
-
- 索引(index),类似于书的目录,基于目录查找数据的速度会很快
-
特点:存储数据持久化,退出也存在。
【4】memory引擎
-
t3.frm
-
- 表结构
-
特点:基于内存存储,只要服务重启,所有数据丢失。
【5】blackhole引擎
-
t4.frm
-
- 表结构
-
特点:存储数据不会有任何反应,不会存储任何数据
【三】约束条件
- 约束条件:限制表中的数据,保证添加到数据表中的数据准确和可靠性!凡是不符合约束的数据,插入时就会失败!
- 约束条件在创建表时可以使用, 也可以修改表的时候添加约束条件
【1】概览
- 非空约束(not null)
- 唯一性约束(unique)
- 组合使用 not null 和 unique
- 主键约束PK(primary key)
- 外键约束FK(foreign key)
- 级联更新与级联删除
ps:创建表结构时,约束条件直接跟在字段后面的为列级约束,若约束条件是用括号时为表级约束。
使用表级约束给多个字段联合添加约束,如:unique(name,email)名字和邮箱这两个字段不能同时重复。
【2】非空约束(not null)
(1)作用
- not null约束的字段不能为 NULL 值,必须赋具体数据
(2)示例
- 创建 t_user 表(name,id,address)其中 id 不能为空。
create table t_user(
name varchar(16),
id int(6) not null,
address varchar(128)
);
mysql> create table t_user(
-> name varchar(16),
-> id int(6) not null,
-> address varchar(128)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> desc t_user;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| name | varchar(16) | YES | | NULL | |
| id | int(6) | NO | | NULL | |
| address | varchar(128) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
# 由于给 id 设置为 not null 所以在插入数据的时候
# 必须给 id 赋值 否则报错
# 没有设置为 not null 的字段 ,不赋值是不会报错的
mysql> insert into t_user(name,address) values("chosen","Shanghai");
ERROR 1364 (HY000): Field 'id' doesn't have a default value
【3】唯一性约束(unique)
(1)作用
- unique 约束的字段具有唯一性,不可重复,但是可以为空置(null)
(2)示例
alter table t_user modify name varchar(128) unique;
mysql> select * from t_user;
+------+-----+----------+
| name | id | address |
+------+-----+----------+
| max | 123 | Shanghai |
| NULL | 123 | Shanghai |
+------+-----+----------+
2 rows in set (0.00 sec)
# 由于给 name 设置了唯一性(unique)
# 所以当 name 再一次赋值 “max” 时 会报错。
mysql> insert into t_user(name,id,address) values("max",456,"Shanghai");
ERROR 1062 (23000): Duplicate entry 'max' for key 'name'
【4】组合使用
(1)not null 和 unique 同时使用
- 被 not null 和 unique 约束的字段,该字段即不能为 NULL 也不能重复;
- 创建表
create table t_user(
id int(10) ,
name varchar(32) not null unique
);
【四】严格模式
-
控制 MySQL 里面存储数据的一些限制规则
-
控制超出长度不提示,控制超出长度提示报错
-
查看严格模式
show variables like "%mode";
show variables like "_mode";
-- 查看严格模式的查询方式有两种
-- SQL中的模糊查询 like 喜欢 / 像
-- like "%mode" % 匹配任意个字符
-- like "_mode" _ 只能匹配单个字符
mysql> show variables like "%mode";
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| block_encryption_mode | aes-128-ecb |
| gtid_mode | OFF |
| innodb_autoinc_lock_mode | 1 |
| innodb_strict_mode | ON |
| offline_mode | OFF |
| pseudo_slave_mode | OFF |
| rbr_exec_mode | STRICT |
| slave_exec_mode | STRICT |
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+
9 rows in set, 1 warning (0.00 sec)
- 某些情况下我们想要关闭某个严格模式
-- 临时修改 : 退出客户端重新连接,修改后严格模式还是原来的
set session sql_mode = 'STRICT_TRANS_TABLES'
-- 永久修改 : 退出客户端重新连接,严格模式修改会一直生效
set global sql_mode = 'STRICT_TRANS_TABLES'
【五】基本字段类型之整型
【1】整型
整数类型 | 字节 | 无符号数的取值范围 | 有符号数的取值范围 |
---|---|---|---|
TINYINT | 1 | 0~255 | -128~127 |
SMALLINT | 2 | 0~65535 | -32768~32767 |
MEDIUMINT | 3 | 0~16777215 | -8388608~8388607 |
INT | 4 | 0~4294967295 | -2147483648~2147483647 |
BIGINT | 8 | 0~18446744073709551615 | -9223372036854774808~9223372036854774807 |
【2】有符号和无符号
- 创建表(约束条件:tinyint unsigned)
-- unsigned 无符号
create table t6(id tinyint unsigned);
# 示例
insert into t6 values(-128);
【3】字段类型的宽度
-
字段类型后面跟着的宽度只是显示的宽度
-
插入的长度是按照谁当前字段的最大长度进行限制
-
特例:
- 只有整型括号内的数据表示表示限制位数而是显示长度
- id int(8):如果数字没有超出8位,那么默认用0填充至8位
- 如果数字超出8位,那么有几位存几位(但是还是遵循最大范围)
【4】约束条件之zerofill
create table t8(id int(8) unsigned zerofill);
# 查看表信息
desc t8;
# 插入数据
insert into t8 values(1);
insert into t8 values(123456789);
# 查看表数据
select * from t8;
【六】字段类型之浮点型
【1】浮点型
数据类型 | 字节数 | 取值范围 |
---|---|---|
FLOAT | 4 | -2^128~2 ^128,即-3.40E+38~+3.40E+38 |
DOUBLE | 8 | -2^1024~ 2^1024,即-1.79E+308~1.79E+308 |
DECIMAL | 设置位数和精度。 | 65 ~ 30 |
float(255,30)
# 总共255位 , 小数部分占 30 位,小数位数大于等于30位的时候,从第8位开始错乱
double(255,30)
# 总共255位 , 小数部分占 30 位,比float精度高。小数位数大于等于30位的时候,从第16位开始错乱
decimal(65,30)
# 总共65位 , 小数部分占 30 位,更加精确的科学技术,小数位数大于等于30位的时候,从第23位开始错乱
create table t9(id float(255,30));
create table t10(id double(255,30));
create table t11(id decimal(65,30));
# 插入数据
insert into t9 values(1.1111111111111111111111);
insert into t10 values(1.1111111111111111111111);
insert into t11 values(1.1111111111111111111111);
# 查看表数据
select * from t9;
select * from t10;
select * from t11;
- 输出结果
mysql> select * from t9;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> select * from t10;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> select * from t11;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111111111111111111100000000 |
+----------------------------------+
1 row in set (0.00 sec)
【2】总结
-- float 类型 从第8为开始模糊
-- double 类型 从第16为开始模糊
-- decimal 类型 从23为开始模糊
--- 精确度 decimal > double > float
【七】字段类型之字符串类型
【1】字符串类型
(1)char
-- 定长字符串 , 给长度 4 位,超出会报错,不够默认用空格补全
(2)varchar
-- 不定长字段,给 4 个长度,超过四个直接报错,有几个存几个
【2】char 与 varchar 的比较
# 创建表
create table t12(name char(4));
create table t13(name varchar(4));
# 插入数据
insert into t12 values('a');
insert into t13 values('a');
# 输出结果
mysql> select * from t12;
+------+
| name |
+------+
| a |
+------+
mysql> select * from t13;
+------+
| name |
+------+
| a |
+------+
insert into t12 values('chosen');
insert into t13 values('chosen');
# 输出结果
mysql> insert into t12 values('chosen');
ERROR 1406 (22001): Data too long for column 'name' at row 1
mysql> insert into t13 values('chosen');
ERROR 1406 (22001): Data too long for column 'name' at row 1
【3】查看长度
select char_length(name) from t12;
select char_length(name) from t13;
# 输出结果
mysql> select char_length(name) from t12;
+-------------------+
| char_length(name) |
+-------------------+
| 1 |
+-------------------+
mysql> select char_length(name) from t13;
+-------------------+
| char_length(name) |
+-------------------+
| 1 |
+-------------------+
【4】解决方法:取消默认去除空格
-- 修改 sql_mode 让MySQL不做自动剔除操作
-- 在修改严格模式的时候去除或者增加单个 带上原来的
-- 覆盖掉
# 查看命令
show variables like "%mode";
# 输出结果
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
- 加一个严格模式
PAD_CHAR_TO_FULL_LENGTH
# 修改命令
# 要在原有的基础上进行替换,所以要带有原有的属性
set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PAD_CHAR_TO_FULL_LENGTH';
# 再次运行查询命令
select char_length(name) from t12;
select char_length(name) from t13;
【5】总结
(1)char
- 缺点:浪费空间
- 优点:存储简单
- 直接按照固定的字符存储数据即可
(2)varchar
- 优点:节省空间
- 缺点:存储麻烦
- 存的时候,在真正数据的前面加报头(表示数据真正大小)
- 取的时候,需要先读取报头,才能读取真实的数据
以前用 char 现在 varchar 使用较多
【八】字段类型之日期时间类型
【1】日期时间类型
date : 年月日
datetime : 年月日时分秒
time : 时分秒
year : 年份
【2】示例
# 创建表
create table student(
id int,
name varchar(16),
born_year year,
birth date,
study_time time,
reg_time datetime
);
# 插入数据
insert into student values(
1,
"chosen",
'2024',
'2024-5-28',
'17:45:00',
'2024-5-10 17:47:00'
);
# 输出结果
mysql> select * from student;
+------+--------+-----------+------------+------------+---------------------+
| id | name | born_year | birth | study_time | reg_time |
+------+--------+-----------+------------+------------+---------------------+
| 1 | chosen | 2024 | 2024-05-28 | 17:45:00 | 2024-05-10 17:47:00 |
+------+--------+-----------+------------+------------+---------------------+
【九】字段类型之枚举和集合类型
【1】枚举和集合
(1)枚举(enum):多选一
- 枚举类型存储数据只能从候选项中选取一个才行
(2)集合(set):多选多
【2】枚举类型(enum)
# 创建表
create table user(
id int,
name char(16),
gender enum('male','female','others')
);
# 插入数据
insert into user(id,name,gender) values(1,'chosen','male');
insert into user values(2,'max','female');
# 由于字段 gender 有多个赋值,enum 只能多选一,所以会报错
insert into user(id,name,gender) values(3,'tom','male,female');
# 查询表数据
select * from user;
#输出结果
mysql> select * from user;
+------+------------------+--------+
| id | name | gender |
+------+------------------+--------+
| 1 | chosen | male |
| 2 | max | female |
+------+------------------+--------+
【3】集合类型(set)
# 创建表
create table teacher(
id int,
name varchar(16),
gender enum('male','female','others'),
hobby set('read books','play games','play sports','listen muisc')
);
# 插入数据
insert into teacher(id,name,gender,hobby) values(
1,
'chosen',
'male',
'read books,play games'
);
insert into teacher(id,name,gender,hobby) values(
1,
'max',
'female',
'listen muisc'
);
# 查询表数据
select * from teacher;
#输出结果
mysql> select * from teacher;
+------+--------+--------+-----------------------+
| id | name | gender | hobby |
+------+--------+--------+-----------------------+
| 1 | chosen | male | read books,play games |
| 1 | max | female | listen muisc |
+------+--------+--------+-----------------------+
【十】总结
【1】字段类型
-- 【一】数字类型
-- 【1】整数类型
-- tinyint int bigint ...
-- 【2】浮点数类型
-- float double decimal
-- 【二】字符串类型
-- 开启严格模式
-- char 自动补全长度
-- varchar 不会自动补全
-- 【三】时间日期类型
-- date 日期 年月日
-- time 时间 时分秒
-- datetime 年月日时分秒
-- year 年份
-- 【四】枚举和集合
-- 枚举 enum 在多个备选项中只能选一个
-- 集合 set 在多个备选项中能选多个 多个之间用,合开
【2】约束条件
-- unsigned 无符号
-- null可以为空
-- not null 不能为空
-- zerofill 默认长度用0填充
-- ● unsigned约束条件用于指定某个字段只能包含非负数(正整数或零)。
-- ● 当将字段定义为unsigned时,它会限制该字段的取值范围为大于等于零的整数。
【3】严格模式
-- 【一】查看所有的严格模式
show variables like "%mode";
-- % 模糊查询任意长度
-- _ 模糊查询一个长度
-- 【二】修改严格模式
-- 【1】全局永久性修改
set global sql_mode = "";
-- 【2】局部临时性修改
set session sql_mode = "";
标签:name,--,浮点,枚举,values,整型,id,select,mode
From: https://www.cnblogs.com/chosen-yn/p/18233795