mysql数据表在定义列时,需要确定列的数据类型,以及列的相关属性或是说约束,那么mysql的列类型大致可分为如下:

列类型可分为如下:

1、数值类型

又分为整数和小数

2、时间和日期类型

3、字符类型

稍微有C基础的同学应该不是很陌生,这里呢我不会讲解太多,稍微解释一下就行。

整数部分

wKiom1ewSx3Bs78UAAAx2PXwr1s455.png

整数部分要注意的地方就是字节以及有符号和无符号的区别

我们知晓1byte=8bit 那么2的8次方就是0-255之间

有进制转换的同学应该知道了,那么有符号和无符号是指他需要1位来标识正负数,所以要减去1位,自然就是7位了,2的7次方就是127了,我们使用unsigned来标识为无符号。

字节数越大就是说位数越多8位,12位,24位,32位,64位,进行转换成10进制就得到最小值和最大值的数据了。

0000 0000 ---1111 1111 转换为10进制就是0-255 转换为16进制就是0-00ff

那么我们在创建字段时,就要考虑该值的大致范围,如我们要存储一个人的年龄则应该是tinyint则比较合适,从而不浪费空间,那么年龄是没有负数的所以是unsigned.


如我们创建一个学生表

create table student(

id int,

name varchar(5),

age tinyint unsigned)


wKiom1ewThfChuHYAAAiAnhHovA831.png

我们发现,在创建完后,查看得知age字段的类型后面有个括号和3,这个则是表示它的显示宽度,也就是说我们在创建字段时也可以这样创建:

age tinyint(3)  表示的是显示宽度并不会限制存储空间

字段名[列类型](显示宽度)


接下来还有一个列属性即zerofill零填充

我们现在插入一条数据并查看

wKiom1ewT4eCFtVLAAASF2NV46c356.png

我们并没有定义它的显示宽度,接下来我们更新一它的字段age

alter table student modify age tinyint(2) zerofill

wKiom1ewT_LhdQJXAAASGjC6hHM699.png

然后再插入一条数据

insert into student values(null,'jack',8);

wKiom1ewUGTir0cwAAAT-oKUQic307.png

查看得知它会自动和在前面添加一个数字0这个就是zerofill的使用。

那么我们规定它的宽度为2位,是不是只能插入1-99之间的数值呢?

接下来我们插入123这个数值是否能插入进去?

wKioL1ewUOzAq8_nAAAhGeE9tUI700.png

我们发现是可插入成功的,说明它并没有限制存储空间。


关于其它的int,smallint,mediumint,bigint也是一样的道理。


接下来我们来学习一下小数

小数呢也分为两类,1是浮点数 2是定点数

浮点数有单精度和双精度

wKioL1ewUgDBJOHbAAAheG_9ptE619.png


单精度和双精度它们分别是32位和64位的,存储空间比较大,但是存储精度不是很高,会出现精度丢失的情况

比如我们创建一个单精度和双精度的来测试一下其精度

alter table student add money float(8,2)//表示小数位数占两位,整数是6位


wKioL1ewU2CSVPA3AAAiL_BxIDk753.png

接下来我们插入一条数据

insert into student values(null,'han',24,123456.12);

wKiom1ewU9vQ59CGAAAnJLrcraI351.png

我们发现没有什么问题,接下来我们再插入以下几条数据

insert into student values(null,'lili',35,1234567.1);

wKiom1ewVF-DXxEvAAAg5hd2Z8g826.png

我们发现当整数部分超过6位数时,数据出现了很大的变化,原来插入的1234567.1并没有真正的插入成功。

那我们再重新一下该字段

alter table student change money qian float;

wKiom1ewVSvA_M5EAAAcJav199o918.png

我们插入以下数据

insert into student values(null,'titi',26,1234567890.1234567890);

wKiom1ewVZiTBha9AAAnDaACvLg300.png

我们发现虽然数据好像插入成功了,但我们检索时看到数据显示不对啊,这就是它的精度丢失了,所以说如果我们要做一个与钱相关的系统时,对于浮点数不管是float,double还是不要用,因为精度不高,通过测试我们知道float的精度是6位,那么dobule的精度是16位

接下来我们测试一 下double

altet table student change qian money double;

wKioL1ewVpCyb7IDAAAlq2KAJH4639.png

接下来我们同样插入如下数据

insert into student values(null,'keke',28,1234567890.1234567890);

wKiom1ewV6yQ1VIWAAAvd9GLers480.png

我们发现,整数部分10位是正确的,但小数部分是7位数了。

wKioL1ewWEayyhdMAAA2ujn9w8E049.png

我们插入15位正数时,小数位数只有2位了,所以它的精度可以说是16位或是17位,如果我们插入超过15位的正数时是

wKioL1ewWLeil8D1AAArLucpFfU578.png

我们发现它所显示的则是使用科学计术法来显示了即1.2345678901234568*10的16次方了所以它的有效范围是12345678901234568 连小数都省略了。


通过上面测试我们发现它们的存储数据会出现精度丢失的情况。所以我们要开发时一定要考虑他们的精度问题。同样浮点数也有有符号和无符号,我们在定义的时候可以定义合适的整数位数和小数位数

他们的定义的格式是这样的:

float(m,d)

double(m,d)  //m是表示总长度 d是表示小数位数  

如果我们插入的数据不管是整数或是小数超过的话就会出现精度丢失,所以它是对存储空间是有限制的,和整数的显示宽度是有区别的哦!