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