一、列类型
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个字节的存储空间
取值范围
定义字段有一个属性,叫unsigned表示无符号整数
如何选择使用哪一种作为字段的类型?
如果选小了,使用中就会溢出
如果选大了,就浪费空间
根据业务需要来确定用哪种
举例:年龄字段age
Tinyint unsigned 0-255有一个最合理类型了
定义语法:
字段名 整数的类型(显示宽度) unsigned zerofill
什么是显示宽度?
最大或最小的数占用的字符位数,就是默认的显示宽度
显示宽度和取值范围是两个事情,没有直接关系!
显示宽度的值不能够起到限制取值范围的作用!
取值范围只依赖于选择的类型!!!!
显示宽度的真正用途
是和zerofill属性配合,在数值占用少于显示宽度的位数时,在左侧补0
显示宽度定义成超过类型正常点位数也没关系
提示:
只有带有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是必须定义的
插入数据
小数在保存时会有近似的现象
不使用unsigned属性允许插入负数
支持使用科学计数法
如果数据中小数部分超出定义的值,会丢弃掉多余的小数部分
如果使用zerofill,同样会根据M的值在左侧补0
Double和float特点是一样的
定点,decimal
定点decimal又被称为精确或严格浮点数,它最大的特点就是不会出现保存时近似的情况。
它的存储方式类似于字符串的保存。
定义语法:字段名 decimal(M,D) unsigned zerofill
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个汉字都能够保存
当存储的数据达不到定义的长度时存入后在后面补空格,取出时又会去掉,对使用没有影响。
当保存的数据超出长度,但是后面是空格时,会自动删除掉空格再存入
举例:哪些适合使用定长字符串类型
如密码字段特别适合,现在通常都是md5的,变成32位的一个字符串
Password char(32)
(2)可变长度字符串,varchar
和定长字符串类型的主要区别,就是根据数据的不同,此种只占用数据需要的长度。而定长会全部占用定义的长度。
定义格式:字段名 varchar(L)
L:长度,按照字节数来计算的,0<L<=65535
L<=255时,会额外占用1个字节用于记录数据的长度,L+1
255<L<=65535时,会额外占用2个字节用于记录数据的长度,L+2
探讨:在存储汉字的情况下,最大可以定义多大的长度?
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开始
插入数据时可以使用数值来代替选项
不允许插入非选项中的数据
在未指定默认值情况,NULL会作为默认值,允许插入
NULL要使用特殊方法查询到
4、集合,set
集合类型适合于保存多选的内容。
定义格式:字段名 set(选项1,选项2, ……)
最多可以有64个选项。
插入数据
插入的数据是有顺序的,插入的数据保存后会自动调整为定义时的顺序
集合类型是使用位的方式来管理的
|
玩游戏 |
00000001 |
1 |
|
跑步 |
00000010 |
2 |
|
读书 |
00000100 |
4 |
|
踢足球 |
00001000 |
8 |
|
上网 |
00010000 |
16 |
使用字段加一个数字查看,发现字段的内容是集合选项所对应的值之和
根据此特点,可以将获取的多选内容的值进行求和然后插入
我们再看一下如何来查询
使用like的方式是可以查到
使用find_in_set()函数进行查询
这种的查询效率也不高
使用位运算符来进行查询
5、日期时间型
包括5种:date, datetime, time, year, timestamp
(1)日期型,date
格式:YYYY-MM-DD
范围:1000-01-01到9999-12-31
定义方法:字段名 date
插入数据
关于2位年值的问题
00-69:2000-2069
70-99:1970-1999
插入的数据可以不是标准的格式,分隔符使用-之外的符号
0000-00-00是合法的数据
某年某月某一天
不合法是不被接受的
(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小时的时间?
代表从当前时刻向前或向后多长时间。
插入数据
有一种特殊的格式: D HH:MM:SS
D代表天数
上面还看到,时间类型,包括之前的日期,日期时间,可以使用简略格式
比如:2020-5-24不用非要写成2020-05-24
(4)年,year
格式:YYYY
取值范围:1901到2155
定义方法:字段名 year
此种类型也支持2位年值方式
不能插入超出范围的数据
(5)时间戳,timestamp
数据类型的含义:代表还是一个日期时间
取值范围:1970-01-01 00:00:00到2037年左右(因为从70开始按秒加上去)
一天是86400秒
但是在数据库还是显示的是一个日期时间格式
定义格式:字段名 timestamp
它的数据还是一个普通日期时间,只是取值范围被限制了
网上有资料说 创建后当表中有一个时间戳类型字段时
会自动附加上两个属性:
Default current_timestamp
On update current_stamp
但我这边实验,没有自动加这两个属性
为了测试手工加上这两个属性
插入数据时,未给出时间戳类型字段的值,则使用当前时间作为其值
修改数据后,此字段的值会自动改为当前时间
此类型的特点就可以用于文章表,插入时可以不给时间,修改时会自动变成最新时间
二、字段的属性和约束
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
一个表只能有一个主键。
主键可以包含多个字段(要保证多个字段数据的组合不能有重复)
组合的主键数据不能有重复的
5、自动增量,auto_increment
也是一个属性,作用是说明字段的值是自动增长的,如果不指定增量的初始值,则从1开始,每次会为字段自动分配一个新的+1的值
设置增长步长:set auto_increment_increment=2; --设置步长为2
三、索引详解
1、一索引,unique key
唯一索引的字段它的值不允许重复。
比如用在会员表的会员名称字段,可以限制不能有相同的会员名。
一个表可以有多个唯一索引字段。
2、索引,index
索引是一种优化查询效率和速度的方式。
但实际上在建表时,通常都不是直接就把索引建立出来。
建立索引的情况:
针对经常出现在where条件中的字段需要建立索引
会对经常出现在排序中的字段有可能需要建立索引
当表中数据很少时,没有必要建立索引。
当字段的数据只有几个值时,不需要建立索引。如性别字段,男,女
字段值中有null,索引是没有作用的,最好指定为not null
一个表可以建多个索引,但是查询时每次只会使用一个索引,因此,不要建立太多的索引。首先利用率低,其次会产生索引很大的问题。插入数据或更新数据时,对索引更新负担很重。另外索引文件 也会很大。
3、索引的建立和删除
在建表时同时创建索引
删除唯一索引
删除索引
添加索引
我是小咖
发个邀请:
如果你正好想学习php,可以与我一起交流,我的VX:feilueze333。下面资料免费赠送。