# MySQL数据类型
🐴
# 前言
MySQL中定义数据类型对数据库的优化是非常重要的,在MySQL中的数据类型大致可以分为三类:
- 数值类型
- 字符类型
- 时间类型
# 数值类型
| 类型 | 大小及范围 | 作用 |
|---|---|---|
tinyint(m) | 1个字节 范围(-128~127) | 小整数 |
smallint(m) | 2个字节 范围(-32768~32767) | 大整数 |
mediumint(m) | 3个字节 范围(-8388608~8388607) | 大整数 |
int(m) | 4个字节 范围(-2147483648~2147483647) | 大整数 |
bigint(m) | 8个字节 范围(+-9.22*10的18次方) | 极大整数 |
float(m,d) | 4个字节 8位精度 m总个数,d小数位 | 单精度浮点数值 |
double(m,d) | 8个字节 16位精度 m总个数,d小数位 | 双精度浮点型 |
decimal(m,d) | 参数m是总个数,d是小数位 | 定点数 |
关于浮点数float,double,decimal,的区别:float在内存中占用4个字节,而double在内存中占用8个字节,所以float的精度没有double高,但是同等条件下CPU处理单精度浮点数的效率要高。
在存储同样范围值时,通常decimal使用的空间更少,一般在存储金额时会使用decimal。
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
# 字符类型
| 类型 | 大小 | 说明 |
|---|---|---|
char | 0-255字节 | 定长字符串 |
varchar | 0-65535 字节 | 变长字符串 |
tinyblob | 0-255字节 | 不超过 255 个字符的二进制字符串 |
tinytext | 0-255字节 | 短文本字符串 |
blob | 0-65535字节 | 二进制形式的长文本数据 |
text | 0-65535字节 | 长文本数据 |
mediumblob | 0-16777215字节 | 二进制形式的中等长度文本数据 |
mediumtext | 0-16777215字节 | 中等长度文本数据 |
longblob | 0-4294967295字节 | 二进制形式的极大文本数据 |
longtext | 0-4294967295字节 | 极大文本数据 |
char类型是定长的,而varchar是变长的,char(m)存储的值长度小于m时,MySQL会在其右边用空格补足,而varchar存储的值是只占用值得本身大小加上一个记录长度的一个字节。char在处理速度上要比varchar快,但是比较占用存储空间blob和text都是为存储很大的数据而设计的数据类型,分别采用二进制和字符方式存储。
# 日期时间类型
| 类型 | 大小 | 说明 |
|---|---|---|
date | 3个字节 | 以YYYY-MM-DD的格式显示,比如:2009-07-19 |
time | 3个字节 | 以HH:MM:SS的格式显示。比如:11:22:30 |
year | 1个字节 | 以YYYY的格式显示如:2019 |
datetime | 8个字节 | 以YYYY-MM-DD HH:MM:SS的格式显示如:2019-09-19 12:11:11 |
timestamp | 4个字节 | 以YYYY-MM-DD HH:MM:SS的格式显示,比如:2019-08-19 12:11:11 |
timestamp存储和时区相关,即会根据时区做转换,而datetime存储和时区不相关,不会做转换;
# MySQL约束
# 主键约束
- 主键约束:
primary key
// 添加主键约束
alter table 表名 add 字段名 int(5) not null, add primary key (`字段名`);
- 自增标志
auto_increment
// 添加自增标志
alter table 表名 add 字段名 int(5) auto_increment;
# 外键约束
- 外键约束:
foreign key
// 添加外键约束
alter table 子表名 add foreign key(子表的外键名) references 父表名(父表主键名) [ON DELETE option] [ON UPDATE option];
外键约束中 option选项可为:
cscade: 从父表中删除或者更新对应的行,当前子表同时删除或者更新对应的行set null: 从父表中删除或者更新对应行,当前子表同时将外键列设置为NULL,如果子表外键字段设置了NOT NULL,还需要设置DEFAULT,否则会出错no action:InnoDB拒绝删除或者更新父表,对父表的外键字段拒绝操作,这意味着删除父表中的行也会失败restrict: 拒绝删除或者更新父表set default:InnoDB目前不支持。
外键约束常用的选项:
//父表更新同时更新子表,父表删除的时候如果子表不存在对应的数据删除成功,如果存在对应数据,删除失败.
on update cscade on delete restrict
//父表更新同时更新子表,父表删除子表的数据也删除.
on update cscade on delete cscade
# 唯一约束
唯一约束 unique
// 添加唯一约束
alter table 表名 add unique (`字段名`)
# 非空约束
- 非空约束:
not null
//添加非空约束
alter table 表名 add 字段名 int(5) not null
# 默认值约束
- 默认值:
default
alter table 表名 add 字段名 int(5) default '值'
参考文献
← 练习-综合性练习二 PgSQL认识与安装 →