mysql建表时存整形数字类型和长度的选择

本文仅供记录参考
字段设计的时候一般整形数字类型的用处

  1. 状态字段,0,1,2,3,4,5 。。。。。。
  2. 描述是和否的,用0和1代替
  3. 唯一标识,如雪花id

针对第一种和第二种情况,我们所用到的数字大小都不会很大,像第二种最大也就是1, 但是再设计字段的时候却有如下几种类型标识

  1. tinyint, 占用1个字节
  2. smallint, 占用2个字节
  3. int 同 integer, 占用4个字节
  4. bigint,占用8个字节

所谓的占用几个字节,这个是存储时固定下来的,我们建表的时候,指定类型的时候括号里可以指定一个长度,这个长度指的不是让我们自己指定占用几个字节,也不是说长度就能决定我们所能存数的数据。所以,当我们不考虑所存储的数据实际大小的时候,针对同一个类型,我们指定的长度最终占用在字节大小是一致的,如果单单从节省存储空间上,针对同一个类型做长度限制是没有意义的。

一个字节占8位,如果考虑无符号的话能标识的最大正整数为255,255占用的长度是三位,而考虑有符号则存储的范围为-128 ~ 127, 占用的最大长度也是三位。长度决定的是显示效果,而类型决定的是数据的范围。怎么理解这句话呢?
先来理解数据范围。
假如我现在有个字段,叫tinyint_demo 类型为tinyint, 长度没有设置。那么不知道各位有没有留意,建表的时候如果是数字类型下面会有个选项叫无符号,默认是不勾选的。我们知道,一个字节8位二进制,最高位是符号位,0标识正数1标识负数,那么如果我们考虑存有符号(即区分正数和负数),那么一个字节最大能表示的数字则为01111111,对应的十进制为127。能表示的最小值为-128。那么我现在没有勾选无符号,则存的数据是有符号的,
那么我设置一个tinyint类型的字段能够存多大呢?
如下图所示,当我们在这个字段存入的数字范围为-128 ~ 127 之间的时候,是可以正常存入的。但是一旦超过这个区域,则直接提示报错Out of range value。
在这里插入图片描述
那么对长度有误解的同学会不会认为这个长度代表的是存储长度呢?比如以为标识长度为4,妄想存下1000以下数字

如下,我们现在将tinyint_demo的长度调整为4,再次尝试录入上述报错的数据,毫无疑问,依然是报错的。
原因就在于,字段能存储的数据范围,再我们定义这个字段的类型的时候就已经决定了。
在这里插入图片描述
在这里插入图片描述
之前上面也说过,建表的时候还有一个无符号可以选择,那么我们就在想,既然数据不需要符号号,高位就可以用来存储数字,则11111111,标识的最大值为255,那么是不是就可以在tinyint这个字段上存下0~255之间的数据呢?答案是肯定的。如下图。
注意更改表结构之前,我将之间加入的数据已经清除了,因为之前存的有负数,我现在改为无符号肯定是更改不成功的。已经Out of range了。
更改成无符号之后,一个字段所能标识的范围扩大了一倍,所以如果我们明确我们的字段不会是负数以后,建议设计为无符号的,也能避免垃圾数据。
在这里插入图片描述
在这里插入图片描述

其它几个类型的字段同理,只要理解了字段类型所表示的数据范围即可。

现在来说一下这个长度的作用,还是拿tinyint来举例,最大代表的值是三位数,那么如果我在长度那里设置成了小于3,会变成什么效果呢?经过测试,小于3不影响实际的存值和取值显示;

那么大于3呢?
比如我现在插入一条个位数,发现也没有什么影响。但是同样在建表语句的时候有一个填充0的选项,配合着这个选项,就能看到效果了。如果我们既选择了填充0,又设置了长度。那么在插入数据的长度小于我们设置的长度时,就会在前面填充对应个数个0.比如我们设置的长度为1, 那么插入数据为1,则不会有任何变化。但是如果我们设置长度为2,那么插入的数据就会变成01;而且这个长度不受实际数据范围限制;比如我们将长度设置为了4,我们知道最大存储的数据长度也才为3,那么依然会在缺少的部分补0。补0的规则是从前填充;
如下,我们设置了长度为4后,然后选择填充,则数据是下面这个样子;
在这里插入图片描述
至于这个东西有啥用,那就不清楚了。比如我们要依赖数据库生成8位的递增序列号时,然后将长度设置为8,类型设置为int,选择填充0,最终生成类型00000001。。。。。。。00000012。。。00000212这样的也许有点用???

总结一下最上面提到的那几种字段情况可知

  1. 牵扯到状态或者是否等的情况下一般我们只使用一个字节的tinyint其实也足够了
  2. 其它数字类型则需要根据长度自行选择,比如雪花id为最大长度为19位,则远远的超过了int所能标识的范围,所以我们要使用bitint
  3. 总之长度和数据能不能存入是没有关闭的,还是要看字段类型所能标识的数据范围,能不能满足我们。
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值