02-Mysql数据类型
数据完整性
- 一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中
- 在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,包括数据字段的类型、约束。
数据类型
- 使用数据类型的原则:够用就行,尽量使用取值范围小的,而不用大的。这样可以更多的节省存储空间
- 常用的数据类型如下:
- 整数:int,bit
- 小数:decimal
- 字符串:varchar,char
- 日期时间: date, time, datetime
- 枚举类型(enum)
- 特别说明的类型如下:
- ecimal表示浮点数,如decimal(5,2)表示共存5位数,小数占2位
- char表示固定长度的字符串,如char(3),如果填充’ab’时会补一个空格为’ab ‘
- varchar表示可变长度的字符串,如varchar(3),填充’ab’时就会存储’ab’
- 字符串text表示存储大文本,当字符大于4000时推荐使用
- 对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径
约束
主键primary key:物理上存储的顺序
非空not null:此字段不允许填写空值
惟一unique:此字段的值不允许重复
默认default:当不填写此值时会使用默认值,如果填写时以填写为准
外键foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并抛出异常
说明:虽然外键约束可以保证数据的有效性,但是在进行数据的crud(增加、修改、删除、查询)时,都会降低数据库的性能,所以不推荐使用,那么数据的有效性怎么保证呢?答:可以在逻辑层进行控制
1、数据类型
- 整型(int)
- 浮点型(float和double)
- 定点数(decimal)
- 字符串(char、varchar、text)
- 二进制数据(Blob)
- 日期和时间类型
2、整数
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次方) |
m代表的是最大的显示宽度,整数类型中,int用的最多。
3、浮点型(float和double)
Mysql数据类型 | 含义 |
---|---|
float(m,d) | 单精度浮点型 8位精度(4字节) m总个数,d小数位 |
double(m,d) | 双精度浮点型 16位精度(8字节) m总个数,d小数位 |
4、定点数
浮点型在数据库中存放的是近似值,而定点类型在数据库存放的是精确值。
decimal(m,d),参数m是定点类型数字的最大个数(精度),范围是0-65。d小数点右侧数字的个数,范围0-30,但不得超过m,对定点数的就算能精确到65位数字。
5、字符串
Mysql数据类型 | 含义 |
---|---|
char(n) | 固定长度,最多255个字符 |
varchar(n) | 固定长度,最多65535个字符 |
tinytext | 可变长度,最多255个字符 |
text | 可变长度,最多65535个字符 |
mediumtext | 可变长度,最多2的24次方-1个字符 |
longtext | 可变长度,最多2的32次方-1个字符 |
- char和varchar:
- char(n)若存入字符数小于n,则以空格补于其后,查询之后再将空格去掉,所以char类型存储的字符串末尾不能有空格,varchar不限于此。
- char(n)固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符+1个字节(n<=255)或2个字节(n>255),所以varchar(4)存入3个字符将占用4个字节。
- char类型的字符串检索的速度要比varchar的快。
- varchar和text:
- varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节
- text类型不能有默认值
- varchar就可以直接创建索引,text创建索引指定前多少个字符,varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。
6、二进制数据
- BLOB和TEXT存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而BLOB是以二进制的方式存储,不区分大小写。
- BLOB存储的数据只能整体读出
- TEXT可以指定字符集,BLOB不用指定字符集。
7、日期和时间类型
MySql数据类型 | 含义 |
---|---|
date | 日期 ‘2017-6-1’ |
time | 时间‘21:18:30’ |
datetime | 日期时间‘2017-6-1 21:18:30’ |
timestamp | 自动存储记录修改时间 |
注意:若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候字段刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。
8、数据类型的属性
Mysql关键字 | 含义 |
---|---|
NULL | 数据列可包含NULL值 |
NOT NULL | 数据列不允许包含NULL值 |
DEFAULT | 默认值 |
PRIMARY KEY | 主键 |
AUTO_INCREMENT | 自动递增,适用于整数类型 |
UNSIGNED | 无符号 |
CHARACTER SET name | 指定一个字符集 |