上一篇: 初识MySQL(如果需要复习或者没学过MySQL的话可以过一下)
存储引擎
不同的文件格式对应不同的存储方式和处理机制[如 txt, pdf, docx, mp4…]
存储引擎 --> 不同的存储机制
MySQL主要存储引擎
Innodb: MySQL5.5版本及之后的默认存储引擎; 存储数据更安全
Myisam: MySQL5.5版本之前的默认存储引擎;存储数据比Innodb更快[我们更注重的是数据安全]
Memory: 内存引擎, 数据全部存放在内存中, 断电数据丢失Blackhole: 无论存什么, 都立刻消失
mysql>show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
主要存储引擎的区别[图示]
# 建库
create database day45;
# 用库
use day45;
# 以不同的引擎建表
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 类型(宽度) 约束条件1 约束条件2...,
- 最后一行不能有逗号
create table t5(
id # 不写字段类型, 报错
);
create table t6(
id int,
name char, # 最后一行有逗号, 报错
);
补充
- 宽度: 一般情况下, 是对存储数据的限制
- 严格模式: 不满足限制条件则报错[不同版本不同效果]
严格模式
如何查看严格模式 --> 模糊匹配
模糊匹配
关键字 like
% : 匹配任意多个字符
_ : 匹配任意单个字符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
# "5.6及以下版本", 修改为严格模式 # 只在当前窗口有效 set session xxx=xxxx; # 全局有效 set global xxx=xxxx; set global sql_mode = 'STRICT_TRANS_TABLES'; # 这个修改完之后 重新进入服务端即可
严格模式到底开不开?
MySQL5.7及之后的版本默认都是开启严格模式的[我的是5.7]
使用数据库的准则:
能尽量少的让数据库干活就尽量少 不要给数据库增加额外的压力开了比较好, 如果不开, 数据库还要帮着截取数据, 多干活儿
# 宽度
create table t7(name char); # char默认宽度是1
insert into t7 values('matrix');
insert into t7 values(null); # 关键字NULL
# 针对不同的版本会出现不同的效果
# 5.6版本默认没有开启严格模式
规定只能存一个字符你给了多个字符,会被自动截取, 不报错
# 5.7版本及以上或者开启了严格模式
规定只能存几个, 不能超,一旦超出范围立刻报错
ERROR 1406 (22001): Data too long for ...
# 约束条件 not null 不能插入null
create table t8(id int,name char not null);
mysql> insert into t8 values(1, 'a');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t8 values(2, null);
ERROR 1048 (23000): Column 'name' cannot be null
约束条件
zerofill 用零填充
unsigned 无符号
not null 非空
基本数据类型
整型
分类
最小整型 小整型 中等整型 整型 大整型
TINYINT SMALLINT MEDUIMINT INT BIGINT
作用
存储年龄、等级、id、号码等等
数据类型 | 字节数 | 带符号最小值 | 带符号最大值 | 不带符号最小值 | 不带符号最大值 |
---|---|---|---|---|---|
TINYINT | 1 | -128 | 127 | 0 | 255 |
SMALLINT | 2 | -32768 | 32767 | 0 | 65535 |
MEDIUMINT | 3 | -8388608 | 8388607 | 0 | 16777215 |
INT | 4 | -2147483648 | 2147483647 | 0 | 4294967295 |
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 | 0 | 18446744073709551616 |
浮点型
分类
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);
# 插入数据实验
mysql> insert into t15 values(1.111111111111111111111111111111);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t16 values(1.111111111111111111111111111111);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t17 values(1.111111111111111111111111111111);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t15;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.01 sec)
mysql> select * from t16;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> select * from t17;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111111111111111111111111111 |
+----------------------------------+
1 row in set (0.00 sec)
精确度比较结果: float < double < decimal
要结合实际应用场景 三者都能使用