Stay hungry, Stay foolish

0%

字节与存储

前一阵子和同事讨论mysql里的字段所能存储的最大最小值的时候,发现一个很奇怪的逻辑:

在phpmyadmin里设置字段的时候,int默认长度是11位,他就认为所能存储的最大值是99999999999(11个9)。

这是典型的计算机基础没有打好。(本文是扫盲篇,如果上述的问题您知道答案,就没有必要看下去了。)

我们都知道:计算机的最小存储单位是位(bit),一个位能表示两个值(0和1)。一个字节(Bytes)呢,就是8个位。8位可以用来表示2^8共256个数字(0~255)。

看一下mysql里的数值型字段的所占的字节数:

TinyInt 1Bytes

SamllInt 2Bytes

MediumInt 3Bytes

Int 4Bytes

BigInt 8Bytes

接下来拿TinyInt来算一下它的最大值和最小值:

TinyInt占1个字节,即8个位,编号0~7

无符号:最小值就是8个位全是0,即:0

最大值是8个位全是1,即2^0+2^1+2^2+2^3+2^4+2^5+2^6+2^ = 2^8 - 1 = 255

有符号:符号占一位,剩余的就是7个位了。
正数的最小值和最大值就是七个0和七个1,即0和127;(原码)
那么负数呢?负数在计算机里用补码来表示(反码加1),即除符号位外,七个1是表示-1,七个零表示的则是-128。
(正数0-127的表示是原码,即除符号位外0000000-1111111,而负数的-1到-127的表示是1111111-0000001,0000000表示-128)
那么默认长度是怎么回事呢?在《高性能Mysql》第二版(P64)里有这样的解释:

MySQL还可以对整形类型定义宽度,比如INT(11)。这对于大多数应用程序是没有意义的:它不会限制值的范围,只规定了MySQL交互工具(例如命令行客户端)用来显示的字符的个数对于存储和计算,INT(1)和INT(20)是一样的
据说打赏我的人,代码没有BUG