编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解

一、列类型

MYSQL的数据类型分为三大类:数值,字符串,日期时间

分类

 

 

 

数值

整数

 

Tinyint, smallint, mediumint, int, bigint

 

小数

浮点数

Float, double

 

 

定点数

Decimal

字符串

 

 

Char,varchar,text,blob,enum,set

日期时间

 

 

Date,time,datetime,year,timestamp

1、数值型

(1)整数

Tinyint,smallint,mediumint,int,bigint分别占用1,2,3,4,8个字节的存储空间

取值范围

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第1张图片

定义字段有一个属性,叫unsigned表示无符号整数

如何选择使用哪一种作为字段的类型?

如果选小了,使用中就会溢出

如果选大了,就浪费空间

根据业务需要来确定用哪种

举例:年龄字段age

Tinyint unsigned 0-255有一个最合理类型了

定义语法:

字段名 整数的类型(显示宽度) unsigned zerofill

什么是显示宽度?

最大或最小的数占用的字符位数,就是默认的显示宽度

 

显示宽度和取值范围是两个事情,没有直接关系!

显示宽度的值不能够起到限制取值范围的作用!

取值范围只依赖于选择的类型!!!!

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第2张图片

 

显示宽度的真正用途

是和zerofill属性配合,在数值占用少于显示宽度的位数时,在左侧补0

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第3张图片

显示宽度定义成超过类型正常点位数也没关系

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第4张图片

提示:

只有带有unsigned属性的字段才能使用zerofill(负数不允许左侧补0)

Zerofill 可以代替 unsigned zerofill

总结:

在没有补0的需求情况下,定义整数类型字段时,可以不管显示宽度

(2)小数

小数又分为浮点和定点两种类型

浮点,float,double

浮点又包括单精度float和双精度double两种

Float占用4个字节的空间

Double占用8个字节的空间

定义的语法: 字段名 float(M,D) unsigned zerofill

M:总有效位数,包括小数部分的位数

D:小数部分的位数,float最大是7,double最大是15

M和D是必须定义的

插入数据

小数在保存时会有近似的现象

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第5张图片

不使用unsigned属性允许插入负数

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第6张图片

 

支持使用科学计数法

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第7张图片

如果数据中小数部分超出定义的值,会丢弃掉多余的小数部分

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第8张图片

如果使用zerofill,同样会根据M的值在左侧补0

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第9张图片

Double和float特点是一样的

定点,decimal

定点decimal又被称为精确或严格浮点数,它最大的特点就是不会出现保存时近似的情况。

它的存储方式类似于字符串的保存。

定义语法:字段名 decimal(M,D) unsigned zerofill

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第10张图片

Decimal同样支持unsigned和zerofill属性

总结:在网站业务中,应尽量使用decimal

2、字符串

(1)定长字符串,char

所谓定长,就是定义了多大的存储空间,就会占用多大的空间。

定义格式:字段名  char(L)

L:允许数据占用的字符位数。L<=255

看手册会发现它说L是字节数,其实是字符数

如果是字节的情况,存储汉字时要考虑字符集的问题

Utf8,一个汉字需要3个字节

Gbk,一个汉字需要2个字节

Gender字段,如果使用字母m代表男,f代表女,L是1就可以了char(1)

现在已经不用按字节来考虑了,是按字符来考虑

比如定义是4个长度,4个字母和4个汉字都能够保存

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第11张图片

当存储的数据达不到定义的长度时存入后在后面补空格,取出时又会去掉,对使用没有影响。

当保存的数据超出长度,但是后面是空格时,会自动删除掉空格再存入

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第12张图片

举例:哪些适合使用定长字符串类型

如密码字段特别适合,现在通常都是md5的,变成32位的一个字符串

Password  char(32)

(2)可变长度字符串,varchar

和定长字符串类型的主要区别,就是根据数据的不同,此种只占用数据需要的长度。而定长会全部占用定义的长度。

定义格式:字段名 varchar(L)

L:长度,按照字节数来计算的,0

L<=255时,会额外占用1个字节用于记录数据的长度,L+1

255

探讨:在存储汉字的情况下,最大可以定义多大的长度?

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第13张图片

Gbk   65535/2 = 32767 再把L+2的2个字节去掉=32765

Utf    65535/3 = 21845  再把L+2的2个字节去掉=21843

提示:多字节字符集情况定义的长度,实际上是指可以插入多少个字符了!

(3)大文本类型,text

又可以分为:tinytext, text, mediumtext, longtext

Tinytext 2^8-1   255   相当于char型的大小

text  2^16-1    65535  相当于varchar的大小

mediumtext 2^24-1 

longtext 2^32-1

以前版本MYSQL,varchar最大是到255

定义格式:字段名  text

2、二进制数据类型,blob

又分为:tinyblob, blob, mediumblob, longblob

占用的存储空间和text相应的类型一样

主要区别就是此种类型是存储二进制数据。比如图片的文件内容。

定义格式:字段名  blob

3、枚举,enum

枚举类型适合保存单选内容。

定义格式:字段名 enum(选项1,选项2,……)

最多可以有65535个选项

插入数据

实际上枚举类型的选项都和一个值相对应,类型下标,但是从1开始

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第14张图片

插入数据时可以使用数值来代替选项

不允许插入非选项中的数据

在未指定默认值情况,NULL会作为默认值,允许插入

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第15张图片

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第16张图片

NULL要使用特殊方法查询到

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第17张图片

4、集合,set

集合类型适合于保存多选的内容。

定义格式:字段名  set(选项1,选项2, ……)

最多可以有64个选项。

插入数据

插入的数据是有顺序的,插入的数据保存后会自动调整为定义时的顺序

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第18张图片

集合类型是使用位的方式来管理的

玩游戏

00000001

1

跑步

00000010

2

读书

00000100

4

踢足球

00001000

8

上网

00010000

16

使用字段加一个数字查看,发现字段的内容是集合选项所对应的值之和

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第19张图片

根据此特点,可以将获取的多选内容的值进行求和然后插入

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第20张图片

我们再看一下如何来查询

使用like的方式是可以查到

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第21张图片

使用find_in_set()函数进行查询

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第22张图片

这种的查询效率也不高

使用位运算符来进行查询

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第23张图片

5、日期时间型

包括5种:date, datetime, time, year, timestamp

(1)日期型,date

格式:YYYY-MM-DD

范围:1000-01-01到9999-12-31

定义方法:字段名  date

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第24张图片

插入数据

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第25张图片

关于2位年值的问题

00-69:2000-2069

70-99:1970-1999

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第26张图片

插入的数据可以不是标准的格式,分隔符使用-之外的符号

0000-00-00是合法的数据

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第27张图片

某年某月某一天

不合法是不被接受的

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第28张图片

(2)日期时间型,datetime

格式:YYYY-MM-DD HH:MM:SS

取值范围:1000-01-01 00:00:00到9999-12-31 23:59:59

定义方法:字段名  datetime

日期时间类型和日期类型特点基本一样,只不过多一个时间部分

包括2位年值,0000-00-00 00:00:00类似

(3)时间,time

格式:HH:MM:SS

取值范围:-838:59:59 到 838:59:59

定义方法:字段名  time

为什么会有超过24小时的时间?

代表从当前时刻向前或向后多长时间。

插入数据

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第29张图片

有一种特殊的格式: D HH:MM:SS

D代表天数

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第30张图片

上面还看到,时间类型,包括之前的日期,日期时间,可以使用简略格式

比如:2020-5-24不用非要写成2020-05-24

(4)年,year

格式:YYYY

取值范围:1901到2155

定义方法:字段名 year

此种类型也支持2位年值方式

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第31张图片

不能插入超出范围的数据

(5)时间戳,timestamp

数据类型的含义:代表还是一个日期时间

取值范围:1970-01-01 00:00:00到2037年左右(因为从70开始按秒加上去)

一天是86400秒

但是在数据库还是显示的是一个日期时间格式

定义格式:字段名 timestamp

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第32张图片

它的数据还是一个普通日期时间,只是取值范围被限制了

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第33张图片

网上有资料说 创建后当表中有一个时间戳类型字段时

会自动附加上两个属性:

Default current_timestamp

On update current_stamp

但我这边实验,没有自动加这两个属性

 

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第34张图片

为了测试手工加上这两个属性

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第35张图片

插入数据时,未给出时间戳类型字段的值,则使用当前时间作为其值

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第36张图片

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第37张图片

修改数据后,此字段的值会自动改为当前时间

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第38张图片

此类型的特点就可以用于文章表,插入时可以不给时间,修改时会自动变成最新时间

 

二、字段的属性和约束

1、是否允许为NULL

可以认为是个约束,当不指定时,默认是允许为NULL       

通常考虑到索引的问题,尽量使用not null,不允许为NULL

Name varchar(20) not null

这样定义后,就不允许插入null了

2、默认值,default

是一个附加属性,所有类型都可以有。

Name varchar(20) not null default ‘’

Flag tinyint unsigned not null default 0

3、注释,comment

一个附加属性,可以为字段进行说明

Flag tinyint unsigned not null default 0 comment ‘标志,1代表正常,2代表禁止登陆,3代表禁止发言’

4、主键,primary key

是一个约束。主键字段数据不能有重复的,也不能为null

Primary key = not null + unique key

一个表只能有一个主键。

主键可以包含多个字段(要保证多个字段数据的组合不能有重复)

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第39张图片

组合的主键数据不能有重复的

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第40张图片

5、自动增量,auto_increment

也是一个属性,作用是说明字段的值是自动增长的,如果不指定增量的初始值,则从1开始,每次会为字段自动分配一个新的+1的值

设置增长步长:set auto_increment_increment=2; --设置步长为2

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第41张图片

三、索引详解

1、一索引,unique  key

唯一索引的字段它的值不允许重复。

比如用在会员表的会员名称字段,可以限制不能有相同的会员名。

一个表可以有多个唯一索引字段。

2、索引,index

索引是一种优化查询效率和速度的方式。

但实际上在建表时,通常都不是直接就把索引建立出来。

 

建立索引的情况:

针对经常出现在where条件中的字段需要建立索引

会对经常出现在排序中的字段有可能需要建立索引

当表中数据很少时,没有必要建立索引。

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第42张图片

当字段的数据只有几个值时,不需要建立索引。如性别字段,男,女

字段值中有null,索引是没有作用的,最好指定为not null

 

一个表可以建多个索引,但是查询时每次只会使用一个索引,因此,不要建立太多的索引。首先利用率低,其次会产生索引很大的问题。插入数据或更新数据时,对索引更新负担很重。另外索引文件 也会很大。

3、索引的建立和删除

在建表时同时创建索引

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第43张图片

删除唯一索引

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第44张图片

删除索引

添加索引

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第45张图片

我是小咖

发个邀请:
如果你正好想学习php,可以与我一起交流,我的VX:feilueze333。下面资料免费赠送。

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第46张图片

编程之路之数据库mysql(四)- 数据类型、字段约束、索引详解_第47张图片

 

你可能感兴趣的:(php进阶之路)