被误解的int(10)

问题: int(1)与tinyint比较

首先需要指出的是

int(M) M指示最大显示宽度。最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关

  • tinyint是一字节(2的8次方)

带符号的tinyint范围是-128~127

无符号的tinyint范围是0~255

  • small是两字节
  • mediumint是三字节
  • int是四字节
  • bigint是八字节

int(10)与int(11)后的括号中的字符表示显示宽度,整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,int类型的字段能存储的数据上限还是2147483647(有符号型)和4294967295(无符号型)。

int(M),当结合可选扩展属性ZEROFILL使用时, 默认补充的空格用零代替

int(M) 在 integer 数据类型中,M 表示最大显示宽度。

在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。

int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。说白了,除了显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。

如果int的值为10
int(10)显示结果为0000000010
int(3)显示结果为010

就是显示的长度不一样而已 都是占用四个字节的空间

所以,tinyint的范围是(-128~127或者0~255),而int(1)的范围是(-20多亿到正20多亿,或者0~4294967295).两者没有任何共同点.

int(10)通常被误解为 0~99 9999 9999,但实际上
int的最大范围是
0~42 9496 7295,那么我们为什么还是用int(10)储存时间戳呢?
因为timestamp也是四字节,它的范围和int的范围是一致的.不会出现超出的问题.

在php中,ip2long() 会转化的范围也是int的范围,所以也不会超出int范围,需要注意的是有的电脑会出现大数值的IP转成long变成负数的情况.sprintf("%u",$long)解决,在我实际的测试中,没出现这个问题.

关于这一点,可以使用255.255.255.255测试,它可能被转成有符号的int最小值,或者无符号的int最大值,至于为什么结果不一致,我也不清楚.我使用了5.5和7.1的版本,也许是版本太高,已经修复了这个问题了吧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值