上篇文章整理了之前的笔记,是关于Mysql数据库介绍和一些相关的一些基本操作,本片文章来整理一下Mysql数据库中的数据类型。
数据类型(列类型)
所谓数据类型是对数据进行统一分类。从系统角度出发是为了能够使用统一的方式进行管理:更好的利用有限的磁盘空间。
SQL将数据类型分为三大类:数值类型,字符串类型,时间日期类型。
数值类型
数值型数据都是数值。系统将数值类型又分为了分为整数型和小数型。
整数型
存放整型数据:在SQL中更多的要考虑如何节省磁盘空间,所以系统将整型有细分为了5类。
Tinyint 迷你整型,使用一个字节存储,表示的状态最多为256种(常用)
Smallint 小整型,使用两个字节存储,最多表示的状态为65536种
Mediumint 中整型 使用三个字节存储
int 标准整型 使用四个字节存储(常用)
Bigint 大整型,使用八个字节存储
小数型
带有小数点或者范围超出整型的数值类型,SQL中将小数型分为两种:浮点型和定点型。浮点型:小数点浮动,精度有限,而且会丢失精度,定点型:不会丢失精度
浮点型
浮点型数据是一种精度型数据:因为超出指定范围之后,会丢失精度(自动四舍五入),浮点型理论上分为两种精度。
Float:单精度,占用四个字节存储数据,精度范围大概为7位左右
Double:双精度,占用八个字节存储数据,精度范围大概为15位左右
float使用方式:直接float表示没有小数部分,可以使用float(M,D)的方式来设置, M代表总长度,D代表小数部分长度,整数部分长度为M-D,在插入数据时,整数部分不能超出数据长度,小数部分可以,会自动四舍五入。如下创建浮点数表:
定点型
定点型:绝对保证整数部分不会被四舍五入,小数部分有可能,理论上小数部分也不会丢失精度。在插入数据时,整数部分不能超出数据长度,小数部分可以,会自动四舍五入。如下创建定点数表:
字符串类型
在SQL中,将字符串类型分为6类:char,varchar,text,blob,enum和set。
char类型
定长字符串,磁盘(二维表)在定义结构是就已经确定了数据的最终存储长度。char(L):L代表length,可以存储的长度,单位为字符。最大长度为255。char(4):在utf8下边需要4*3=12个字节。
varchar类型
变长字符串,在分配空间时,按照最大的空间分配,但实际上最终用了多少根据具体的数据来确定。varchar(L):L代表字符串长度,理论长度65536个字符,但是会多出1到2个字节来确定存储的实际长度varchar(10):的确存了10个汉字,utf8环境下10*3+1=31。
如何选择定长或者变长字符串?
定长的磁盘空间比较浪费,但是效率高,如果数据基本上确定长度都一样,就使用定长。变长磁盘空间比较节省,但是效率低:如果数据不能确定长度,就是用变长。
文本字符串类型
如果数据量非常大通常说超过255个字符就会使用文本字符串,根据数据长度将文本字符串类型分为两类:text和blob。
text:存储文字(二进制数据实际上是存储路径)
blob:存储二进制数据(通常不用)
枚举字符串类型
枚举:enum,事先将所有可能出现的结果都设计好,实际存储的数据必须是规定好的数据中的一个。
枚举的使用方式:
语法格式定义:enum(可能出现的元素列表)
使用:存储数据只能存储上面定义好的数据。
作用之一: 规范数据格式: 数据只能是规定的数据中的其中一个
作用之二: 节省存储空间(枚举通常有一个别名: 单选框): 枚举实际存储的是数值而不是字符串本身.
枚举原理:
枚举在进行数据规范的时候(定义的时候)系统会自动简历一个数字与枚举元素的对应关系(关系放到日志中),然后再进行数据插入的时候,系统自动将字符串转换成对应的数字存储,然后进行数据提取的时候,系统自动将数值转换成对应的字符串显示。
集合字符串类型
集合和枚举很类似。实际存储的是数值而不是字符串(集合是多选)
集合的使用方式:
语法格式定义:set(元素列表)
使用:可以使用多个元素列表的元素,使用逗号隔开。
时间日期类型
Datetime:时间日期 格式是YYYY-mm-dd HH:mm:ss表示范围为1000到9999
Date:日期,就是datetime中的date部分
Time:时间(段),值某个区间之间,负时间到正时间,如果该类型字段的数据被更新,该类型对应字段一定会更新到当前时间
Timestamp:时间间戳,并不是时间戳,只是从1970年开始的YYYY-mm-dd HH:mm:ss格式,与datetime完全一致
Year:年份,两种形式,year(2)和year(4)
Mysql记录长度
Mysql记录规定:任何一条记录最长不超过65535个字节(varchar永远也达不到理论值)
varchar实际存储长度能达到多少?根据字符集来决定。
utf8理论值为21844个字符
GBK理论值为32766个字符
想用完整65535个字节长度,增加一个tinyint字段即可,并且保证所有字段都不允许为空。Mysql中text文本字符串,不占用记录长度,它是额外存储的,但是text文本字符串也是属于记录的一部分,它一定需要占据记录中的10个字节。(保存数据的地址和长度)