精确值类型
整数类型
TINYINT (M):
所占内存空间:1个字节
取值范围:-2^7~2^7-1,即 -128到127
SMALLINT(M):
所占内存空间:2个字节
取值范围:-2^15~2^15-1
MEDIUMINT(M):
所占内存空间:3个字节
取值范围:-2^23~2^23-1
INT(M):
所占内存空间:4个字节
取值范围:-2^31~2^31-1
BIGINT(M):
所占内存空间:8个字节
取值范围:-2^63~2^63-1
Unsigned(无符号)属性修饰整数类型的意义:
相当于将区间右移,比如TINIINT,右移,起始点由-128右移到0的位置,最终范围变成了0~255。
定点数类型DECIMAL(M,D)
取值范围:
DECIMAL类型定义的时候可以包含一个最大有效位M和一个小数位D,也就是精度和小数位数。M的取值范围为1~65,D的取值范围为0~30,并且D的值不能超过M。M和D都是可选的,D的默认值为0,M的默认值为10。
注意,最大有效位=整数部分+小数部分
也就是说,整数部分的长度加上小数部分的长度就是最大有效位。
假设我们定义的为:DECIMAL(4,1),那么表示最大有效位为4,其中小数有1位,因此整数部分有3位。所以得出这个列的取值范围为:-999.9~999.9。
还有一个需要注意的问题:unsigned修饰DECIMAL类型的时候,是舍去了整个负数部分。
假设定义:DECIMAL(4,1) UNSIGNED,那么它的范围就变成了0~999.9
存储空间:
取决于小数点左右两侧数字个数,每一侧每9位数字需要4个字节,最后剩下的数字需要1~4个字节。存储空间是小数点左右两侧数值所需存储空间的总和。
剩下的数字需要1~4个字节具体为:
剩余位数:字节数
0:0
1:1
2:1
3:2
4:2
5:3
6:3
7:4
8:4
9:4
即假如剩余的数字的位数为6,则还需要3个字节来存储。
一般涉及到金钱这种斤斤计较的东西(不允许有误差),都用decimal。
整数类型和定点数类型的特点就是不会自动进行四舍五入,计算也是十分精确的。
浮点类型
单精度类型FLOAT(M,D)
存储空间:4个字节
取值范围:
最小非0值:±1.175494351E-38
最大非0值:±3.402823466E+38
双精度类型DOUBLE(M,D)
存储空间:8个字节
取值范围:
最小非0值:±2.2250738585072014E-308
最大非0值:±1.7976931348623157E+308
浮点类型说明:
unsigned修饰浮点类型:
该类型的负数部分将会去掉,只保留0到正数的部分。
省略M(最大有效位)和D(小数位数):
省略M和D的时候会根据硬件能支持的最大精度来存储。
超过精度会四舍五入。
FLOAT(p):
这种语法也是可以的。p的取值范围为0~53,如果p在0~24范围内,则该列为单精度,如果p在25~53范围内,则该列为双精度类型。
位域类型BIT(M)
取值范围:
0~2^m-1,1≤m≤64
存储空间:
取决于m,大约(m+7)/8 个字节
m为一个1到64的整数,默认值为1
加入我们创建了一个表:
Create table test (b BIT(3));
插入数据的时候格式要注意,格式为b'values',并且value只能由0和1组成:
Insert into test (b) values(b'101');
查询的时候也要注意,BIT列查出来的数值不能打印显示,需要加上0或者使用函数如cast(),bin(),oct()或者hex()
如: select b+0 from test;
查出来的结果为5
Select bin(b) from test;
查出来结果为101
显示宽度M说明:
如果没有指定显示宽度,则会以该列最长值的长度作为显示宽度。
我们创建表的时候经常会写这样的,如下:
Create table user(id int(10) zerofill,age int(3))charset utf8;
那么int(10)中的数字10就代表显示宽度。
它表示整数再数据库中显示的数字+符号的个数。
特点:
不影响数据的大小,只改变显示。可以利用zerofill,使数字变为指定格式。
Zerofill只会在数字面前补0,因此只有无符号的类型能用。