数据库引擎

---恢复内容开始---

引擎: 数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎 存储引擎是针对表的 常见的存储引擎 innodb :mysql的默认引擎 ,支持事件,行级锁,功能最多 myisam: 查询速度很快 memory:存储于内存,重启服务器资料就没了 balckhole: 存啥没啥 ```python 验证:create database db1; use db1; 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;#啥都没 ``` 创建表的完整语法 ```python create table 表名(字段名,类型[(宽度),约束条件])engine = innodb charset = utf8;

create table dbl.t1(name char(3) not null);
数据插入时,name不能为空(null),且最长只能存放三个字符

此时name的默认值为null,当什么都不传会传""并不会报错,当传null时会报错

数据库模式
```python
分类:非安全模式(no_engine_substitution)
安全模式(严格模式,strict_trans_tables)
sql_mode反映数据库的全局变量,数据库模式限制的是客户端对服务器操作数据的方式,就是说客户端可以自己设定数据库模式,如果不设定,就使用默认的数据库模式 ,5.6版本sql默认的是非安全模式,5.7以上版本默认为安全模式
1.查看数据模式
show variables like "%mode%"#跟爬虫一样吧,查找带有mode的变量
2.设置数据库模式
set global sql_mode = "strict_trans_tables";
3.重启客户端

数据类型

规定了数据库可以存放哪些数据
分类:整形,浮点型,字符型,时间类型,枚举型和集合型
数字类型两种:有符号,无符号
整形:
①tinyint(1字节)
②smallint(2字节)
③mediumint(3字节)
④int(4字节)
⑤bigint(8字节)
#不同类型所占字节数不一样,决定了所占空间及存放数据的大小限制
通常使用tinyint和int
1字节8个二进制位,第一位表示符号,故1个字节的有符号范围(-128-127)
#非安全模式下,存入数值超范围,默认只存范围内的值
#安全模式,超过范围会报错#ERROR 1264 (22003): Out of range value for column 'age' at row 1
规定宽度
1.不是决定整形存放数据的宽度,超过宽度可以存放,最终由数据类型所占字节决定
2.如果没有超过限制宽度且有zerofill 限制,会用0填充前置位的不足位
3.没有必要规定宽度,默认设置的宽度就是该整形能存放的最大宽度
约束条件
unsigned,zreofill
unsigned 无符号数
zerofill不足设定宽度的,会用0填充前置位的不足位

浮点型

(M,D)M为尾数,D为小数位
float(255,30):4字节,精度低,最常用
double(255,30):8字节,精度高,占位多
decimal(65,30):字符串存,全精度

create table t1 (x float(50,20),y double(50,20),z decimal(50,20));
insert into t1 values(1.111111111111111111,1.111111111111111111,1.111111111111111111)
#结果
------------------------+------------------------+------------------------+
| x                      | y                      | z                      |
+------------------------+------------------------+------------------------+
| 1.11111116409301760000 | 1.11111111111111120000 | 1.11111111111111111100 |
宽度相同,但是精度存在差别
通常用float,精度够用了

字符型

分类:
char:定长
varchar:不定长
宽度:
限定存储宽度
char(4):以4个字符存储,是字符数,不是字节,超出报错,存取高效,浪费空间,取时没4位取1次
varchar(4):数据长度决定字符长度,但也不能超出长度,存取低效,节省空间,不知道数据的具体长度,会在数据头加上数据长的信息,占1bytes

存放数据,验证长度:
①创建表,分别设字段 x char类型,y varchar类型
create table t1(x char(4),y varchar(4));
insert into t1("a","b");
select * from t1;结果它两没有差别,因为mysql自动进行了优化
②更改模式
sql_mode = "strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
+---------------+---------------------------------------------+
| Variable_name | Value                                       |
+---------------+---------------------------------------------+
| sql_mode      | STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH |
+---------------+---------------------------------------------+
重启客户端
select * from t1:
显示效果仍然一样
select char_length(x),
char_length(y)  from t1;
mysql> select char_length(x),char_length(y) from t8;
+----------------+----------------+
| char_length(x) | char_length(y) |
+----------------+----------------+
|              4 |              1 |
+----------------+----------------+
1 row in set (0.00 sec)

char 一定按规定宽度存放数据,以规定宽度读取数据,通常更占用空间
varchar 需要数据头,1-2bytes
首先根据数据长度,计算所需宽度,并在数据开始以数据头方式将宽度信息保存,是一个计算耗时过程,取先读取宽度信息,以宽度信息为标准,读取数据,通常节省空间
总结:数据长度相近的数据提倡用char来存放数据,数据需要高速存取,以空间换时间,来用char

时间类型

类型:
year:yyyy(1901/2155)
date:yyyy-MM-dd(1000-01-01/9999-12-31)#需要以字符串方式传入
time:HH:mm:ss
datetime:yyyy-MM-dd HH:mm:ss(1000-01-01 00:00:00/9999-12-31 23:59:59)
timestamp:yyyy-MM-dd  HH:mm:ss(1970-01-01 00:00:00/2037-01-01 00:00:00)

宽度
主动设置无效

datetime vs timestamp
datetime:时间范围,不依赖当时时区,8字节,可以为null
timestamp:时间范围,依赖当时时区,4字节,有默认值CURRENT_TIMESTAMP)

+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| y     | year(4)   | YES  |     | NULL              |                             |
| d     | date      | YES  |     | NULL              |                             |
| t     | time      | YES  |     | NULL              |                             |
| dt    | datetime  | YES  |     | NULL              |                             |
| ts    | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
#除了year 都以字符串传入

枚举类型和集合类型

枚举类型enum : 多选1,
1个不选?
选2个?
选不在范围?
mysql> insert into t10 values("");
ERROR 1265 (01000): Data truncated for column 'sex' at row 1
mysql> insert into t10 values("haha");
ERROR 1265 (01000): Data truncated for column 'sex' at row 1
mysql> insert into t10 values("male,female");
ERROR 1265 (01000): Data truncated for column 'sex' at row 1
集合类型:多选多
1个不选
有默认值,不会报错
选的不在范围内
报错
只选1个
在范围内就不会报错


约束条件:
not null 不为空
default 默认值
unsigned 无符号
zerofill 0填充
auto_increment 自增,只能加给key字段辅助修饰
primary key 主键,唯一标识
foreign key 外键,其他表的主键
unique key 唯一性数据

单列唯一
create  table t12(id int unique);
联合主键:
create table t13(host char(10) ,post int,primary key(host,port) )

<p>---恢复内容结束---</p>
原文地址:https://www.cnblogs.com/robert-zhou/p/10241372.html