被误解的int(10)

来源:互联网 发布:阿里云最便宜的服务器 编辑:程序博客网 时间:2024/06/05 15:39

问题: 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的版本,也许是版本太高,已经修复了这个问题了吧