数据类型(列类型)--数值类型、时间日期型、字符串型
所谓的数据类型:对数据进行统一的分类,从系统的角度出发为了能够用统一的方式进行管理,更好地利用有限的空间
SQL将数据类型分为三类:数值类型,字符串类型和时间日期类型
数值型
数值型数据:都是数值
系统将数值型分为整数型和小数型
整数型
存放整型数据:在SQL中因为要考虑如何节省磁盘空间,所以系统将整型又细分成5类:
Tinyint:迷你整型,使用一个字节存储,表示的状态最多为256种(常用)
Smallin:小整型,使用2个字节存储,表示的状态最多为65536种
Mediumint:中整型,使用3个字节存储
Int:标准整型,使用4个字节存储(常用)
Bigint:大整型,使用8个字节存储
创建一张整型表
插入数据,只能插入整型,只能插入范围内的整型
SQL中数据类型都默认有符号,分正负
有时候需要使用无符号数据,需要给数据类型限定:int unsigned; -- 无符号:从0开始
数据插入
查看表结构的时候,发现每个字段的数据类型之后都会自带一个括号,里面有指定的数字
显示宽度没有特别的含义,只是默认地告诉用户可以显示的形式而已,实际上用户是可以控制的,这种控制不会改变数据本身大小
显示宽度的意义:当数据不够显示宽度的时候会自动让数据变成对应的显示宽度,通常需要搭配一个前导0来增加宽度,不改变值大小:zerofill(零填充),零填充会导致数值自动变成无符号
零填充+显示宽度效果
零填充的意义(显示宽度):保证数据格式
小数型
小数型:带有小数点或者范围超出整型的数值类型
SQL中:将小数型细分为2种:浮点型和定点型
浮点型:小数点浮动,精度有限,并且会丢失精度
定点型:小数点固定,精度固定,不会丢失精度
浮点型
浮点数据是一种精度型数据,因为超出指定范围之后,会丢失精度(自动四舍五入)
浮点型:分为两种精度
Float:单精度,占用4个字节存储数据,精度范围大概为7位左右
Double:双精度,占用8个字节存储数据,精度范围大概为15位左右
创建浮点数表:浮点的使用方式:直接float表示没有小数部分,float(M,D):M代表总长度,D代表小数部分长度,整数部分长度为M-D
插入数据:可以是直接小数,也可以是科学计数法
浮点型数据的插入:整数部分是不能超出长度的,但是小数部分可以超出长度(系统会自动四舍五入)
结果:浮点数一定会进行四舍五入(超出精度范围),浮点数如果是因为系统进位导致整数部分超出指定的长度,那么系统也允许成立
定点型
定点型:绝对地保证整数部分不会被四舍五入(不会丢失精度),小数部分有可能(理论上小数部分也不会丢失精度)
decimal:变长,大致是每9个数字,采用4个字节存储。M最大是65,D最大是30。
创建定点数据,以浮点数作为对比
插入数据:定点数的整数部分一定不能超出长度(进位不可以),小数部分的长度可以随意超出(系统自动四舍五入)
浮点数如果进位导致长度溢出没有问题,但是定点数不行
查看数据效果
时间日期类型
Datetime:时间日期,格式是YYYY-MM-DD HH:ii:ss,表示的范围是从1000到9999年,有0值:0000-00-00 00:00:00。存储空间:8位。
Date:日期,就是datetime中的date部分。存储空间:3位。
Time:时间(段),指定的某个区间之间,-时间到+时间(过去的某个时间或者将来的某个时间)。存储空间:3位。
Timestamp:时间戳,并不是时间戳,只是从1970年开始的YYYY-mm-dd HH:ii:ss格式与datetime完全一致。存储空间:4位。
Year:年份,两种形式,year(2)和year(4):1901-2155。存储空间:1位。
创建时间日期表
插入数据:时间time可是是负数,可以是很大的负数,year可以使用2位数插入,也可以用4位数
timestamp字段:只要当前所在的记录被更新,该字段一定会自动更新成当前时间
字符串类型
在SQL中,将字符串类型分成了6类:char,varchar,text,blob,enum和 set
定长字符串
定长字符串:char,磁盘(二维表)在定义结构的时候,就已经确定了最终数据的存储长度
char(L):L代表长度,可以存储的长度,单位为字符,最大长度值可以为255
char(4):在utf8环境下,需要4*3=12个字节
变长字符串
变长字符串:varchar,在分配空间的时候,按照最大的空间分配,但实际上最终用了多少,是根据具体的数据来确定
Varchar(L):L表示字符长度,理论长度是65536个字符,但是会多出1到2个字节来确定存储的实际长度,但实际上如果长度超过255,既不用定长也不用变长,使用文本字符串text
Varchar(10):的确存了10个汉字,utf8环境下,10*3+1=31(bytes)
Varchar(3):的确存了3个汉字,utf8环境下,3*3+1=10(bytes)
定长与变长的存储实际空间(utf8)
实际存储数据 | Char(4) | Varchar(4) | Char占用字节 | Varchar占用字节 |
ABCD | ABCD | ABCD | 4*3=12 | 4*3+1=13 |
A | A | A | 4*3=12 | 1*3+1=4 |
ABCDE | × | × | 数据超过长度 | 数据超过长度 |
如何选择定长或者变长字符串呢?
定长的磁盘空间比较浪费,但是效率高;如果数据基本上确定长度一样,就使用定长,如身份证,电话号码,手机号码等
变长的磁盘空间比较节省,但是效率低;如果数据不能确定长度(不同数据有变化),如姓名,地址等
文本字符串
如果数据量非常大,通常说超过255个字符就回使用文本字符串
文本字符串根据存储的数据的格式进行分类:text和blob
Text:存储文字(二进制数据实际上都是存储路径)
Blob:存储二进制数据(通常不用)
枚举字符串
枚举:enum,事先将所有可能出现的结果都设计好,实际上存储的数据必须是规定好的数据中的一个
枚举的使用方式
定义:enum(可能出现的元素列表);//如enum('男','女','男女不限','妖','保密');
使用:存储数据,只能存储上面定义好的数据
加入数据:作用之一:规范数据格式,数据只能是规定的数据中的其中一个
作用之二:节省存储空间(枚举通常有一个别名:单选框):枚举实际存储的是数值而不是字符串本身
在mysql中,系统也是自动转换数据格式的,而且基本与PHP一样(尤其是字符串转数字)
证明字段存储的是数值:将数据取出来+0就可以判断出原来的数据存的到底是字符串还是数值,如果是字符串最终结果永远为0,否则就是其他值。