MySQL中整型M-unsigned-zerofill的区别与意

2019-06-18  本文已影响0人  djz0306

因为涉及到数据类型和范围,所以本篇新建一个表,表结构如下:

含tinyint型数据的表结构.jpg

该表中含有 tinyint 型数据,按照上一篇说的 tinyint 型的有符号范围是-128-127。那么先插入一个在此范围内的数,例如24。顺便回顾一下插入的语句:

insert into stu (sname ,age) values ("佟湘玉" ,24);

结果如下:

向有符号 tinyint 型中插入范围内的数.jpg

返回正确的结果。如果向其中插入一个大于127的数呢?按照测试的思维,试一试边界值128

insert into stu (sname ,age) values ("缺德道人" ,128);
向有符号 tinyint 型中插128.jpg

可以看到插入的时候有一个 warning ,查看数据发现 age 变成了127。在新版中超过范围的值都会被缩到127,老版中会报错 “ Out of range value”

同样的,边界的各个值进行插入:

有符号tinyint 型范围边界测试.jpg

只要是在 -128 - 127 之间都可以正常插入,如果是大于127就会取127,如果小于-128就会取-128。可以继续测试其他特殊值,例如0能够正常插入,255插入后变为127。

unsigned

在原来的表基础上增加一个 IQ 列,为无符号 unsigned:

alter table stu add IQ tinyint unsigned not null default 0;

如下所示:

增加unsigned tinyint类型列.jpg

如果往 IQ 列中插入负数,例如-1:

insert into stu (sname ,age ,IQ) values ("燕小六", 25, -1);

结果如下:

向unsigned tinyint中插入负数.jpg

类似的,-1被变成了0(不是默认值原因,默认值为其他值也会保存成0)。同样的向其中插入一些边界数据,可以看到:

unsigned tinyint 型边界测试.jpg

大于255以后就会保存255,小于0以后就会保存0,范围为:0-255

zerofill与M参数

向原来的表中插入新的编号 snum 列:

alter table stu add snum smallint(5) zerofill not null default 0;

插入后如下所示:

增加 zerofill smallint 型列.jpg

其中 snum 默认就为 unsigned 类型,这是因为使用了 zerofill 默认为 unsigned 类型

向其中插入一行数据:

insert into stu (sname ,age ,IQ ,snum) values ("李大嘴" ,30 ,95 ,5);

结果如下所示:

插入编号为5的数据.jpg

可以看到5前面填充了0,而宽度为5。zerofill 表示补充0,M表示补充以后的宽度,单独使用M没有意义

其他例如bigint均类似上面的例子,只是范围不一样

上一篇下一篇

猜你喜欢

热点阅读