MySQL int 类型的长度和范围解惑

开发过程中,新来的小朋友问到: MySQL见表过程中,字段类型为int的长度是什么意思?最大值是 999999999 吗?

虽然知道 int(1) 这个并不表示只能表示 0-9 等,但是替换到 int(11) 的时候思维有时候会缓不过来,直到有一次需求要求 指定字符长度 的时候才恍然大悟, int(6) 就是 000001 ~ 099999 等等,但是依旧可以表示 12345678 等数字

提问

Mysql 建表过程中:

  1. 字段类型int的长度代表什么?
  2. 是表示值的最大宽度吗?或者是位数吗?
  3. 为什么 int(1) 的时候我可以存储 100、10000、100000 呢,甚至可以存储 2147483647 呢?
  4. 为什么 Int(1) 的时候我不能存储 4294967295 而可以存储 2147483647 ?

分析

MySQL中int类型占用4个字节[byte(B)],1B有8个位[bit(b)],一个位(b)就代表一个0或者1,那么MySQL中int占用4B,对应位就是 4*8b = 32b 了,也就是说 int 表示的数字 个数 是: 2的32次方。

因为字节分有符号和无符号两种,于是 int 有符号 的 范围就是 -2的31次方 到 2的31次方减去1 [?1 为什么不是32次方?] [?2 为什么要减去1?],即 -2147483648 ~ 2147483647; int 无符号(unsigned) 的 范围就是 0 到 2的32次方减去1。

知道了 int 类型的范围后,我们再来看看长度是什么意思。 在MySQL手册中,字段类型的长度用 “M” 表示,表示最大显示宽度。 int 的 最大有效显示宽度是 255。 注意: 此处表示 显示宽度 和 存储大小或类型及范围 无关

问中问

  • ?1 为什么不是32次方?
    • 因为有一个位要表示符号
  • ?2 为什么要减去1?
    • 因为 32 位在二进制中最大表示 32 个 1 ,所以就存在着 减去 1

解答

  1. 字段类型int的长度表示有效宽度,配合 zerofill 的话会更容易理解。 但这个有效宽度并不是表示这个值的范围,也就是说可以超过这个有效宽度
  2. 不是表示这个数字的最大占位宽度,也不是表示这个数字的占位个数。而是表示默认的显示宽度(当 zerrofill 时)
  3. int(1) 的时候可以存储 100、10000、100000,甚至可以存储 2147483647,是因为 int 表示 数值的范围, 1表示有效显示宽度
  4. Int(1) 的时候不能存储 4294967295 而可以存储 2147483647,是因为 int 有 有符号 和 无符号 两种表示方式,你选择的是 有符号的方式。

总结

  1. 数值类型的长度及范围是两码事,不能混为一谈
  2. MySQL中数值的范围是根据位来确定的
  3. 在创建表的过程中可以根据这个数值的实际范围来选择 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT 等

扩展

  • MySQL数值相关的范围及占用字节数

| 类型 | 占用字节数 | 有符号取值范围 | 无符号取值范围 | |:--:|:------:|:---------------:|:------------:| | TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | | SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 | | MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 | | INT | 4 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 | | BIGINT | 8 | -2^63 ~ 2^63-1 | 0 ~ 2^64-1 |

参考文章

转载于:https://my.oschina.net/u/616147/blog/1785090

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值