🕳️ sql 数据类型 tinyint —— 你个磨人的小妖精

165 阅读3分钟

今天存了一个数字 180 (这个是产品id) 到数据库的一个字段里面

可是有人反馈存进去新建的产品和选的产品对不上,对的是另外一个产品

于是去看了一下代码,逻辑没错

去看一下表的设计

这个数字的定义的类型是tinyint,长度是2

正好对上反馈的这个错误

这个字段永远最大只能存到127,也就是大的就默认存成127,导致拿的产品对不上

今天我们来讲一下sql中的tinyint

类型内存(字节)带符号最小值不带符号最小值带符号最大值不带符号最大值
tinyint1-1280127255
smallint2-3276803276765535
mediumint3-83886080838860716777215
int4-2147483648021474836474294967295
bigint8-2^6302^63 - 12^64 - 1

tinyint

tinyint 占用1字节的储存空间,即8位(bit)。

先看看tinyint的取值范围是怎么得来的

先看无符号的情况。

无符号 的 最大值最小值

无符号的最小值就是8位(bit)都为0,换算成十进制就是0。所以无符号的tinyint的最小值就是0。

无符号的最大值就是8位(bit)都是1, 11111111,换算成十进制就是255。

再来看看有符号的情况。

计算机里,用最高位表示符号。0表示正,1表示负,剩下的表示数值。

有符号 的 最大值和最小值

那么有符号的8bit的最小值就是:

1 1 1 1 1 1 1 1 = -127
表示负值 最前面的1代表-这个符号,实际存的值是7个1,1111111这7个1的二进制转十进制是127

所以最后

0 1 1 1 1 1 1 1 = +127

可能你有疑问,上面这种推算为什么有符号的负值是-127,而不是-128呢?

因为,在计算机中,表示负值是用补码。-128+1 = -127。

所谓补码的意思就是: 正数的补码就是其原码;负数的反码+1就是补码。

那为什么最终带符号的最小值是-128呢?对,数据库设置tinyint的字段的最小值可以存到-128,但是-129就会提示了:错误 1264 - Out of range value for column 'number' at row 1(就是说超出范围了)。

虽然-0也是0,但是,根据补码体系,-0的补码和0是不同的,这样,就出现,两个补码代表一个数值的情况。为了将补码与数字一一对应,所以规定0一律用+0代表。同时,为了充分利用资源,就将原来应该表示-0的补码规定为代表-128.


最后

数据库设计合理很重要,如果出现错误,检查逻辑没问题,值也存上去了,货不对版的话,可以看看表字段的类型和长度等定义的设计有没有错。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天 点击查看活动详情