今天存了一个数字 180 (这个是产品id) 到数据库的一个字段里面
可是有人反馈存进去新建的产品和选的产品对不上,对的是另外一个产品
于是去看了一下代码,逻辑没错
去看一下表的设计
这个数字的定义的类型是tinyint,长度是2
正好对上反馈的这个错误
这个字段永远最大只能存到127,也就是大的就默认存成127,导致拿的产品对不上
今天我们来讲一下sql中的tinyint
| 类型 | 内存(字节) | 带符号最小值 | 不带符号最小值 | 带符号最大值 | 不带符号最大值 |
|---|---|---|---|---|---|
| tinyint | 1 | -128 | 0 | 127 | 255 |
| smallint | 2 | -32768 | 0 | 32767 | 65535 |
| mediumint | 3 | -8388608 | 0 | 8388607 | 16777215 |
| int | 4 | -2147483648 | 0 | 2147483647 | 4294967295 |
| bigint | 8 | -2^63 | 0 | 2^63 - 1 | 2^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 天 点击查看活动详情