mysql 中 整数 类型大小显示问题

MySQL 数据库中 整型类型有那些?

由小到大顺序有 tinyint < smallint < int < bigint

首先 MySQL 中,设置的length,和精度没有关系,而是配合 zerofill 用来显示指定位数的数据的。

测试开始 建立表

CREATE TABLE `NewTable` (
`n`  int(2) UNSIGNED ZEROFILL NULL DEFAULT NULL ,
`m`  int(6) UNSIGNED ZEROFILL NULL DEFAULT NULL ,
`x`  int(11) UNSIGNED ZEROFILL NULL DEFAULT NULL 
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci
ROW_FORMAT=DYNAMIC
;

测试 插入语句

INSERT INTO `pic_`.`test` (`n`, `m`, `x`) VALUES ('1', '1', '1');
INSERT INTO `pic_`.`test` (`n`, `m`, `x`) VALUES ('10', '10', '10');
INSERT INTO `pic_`.`test` (`n`, `m`, `x`) VALUES ('1000', '1000', '1000');
INSERT INTO `pic_`.`test` (`n`, `m`, `x`) VALUES ('10000', '10000', '10000');
INSERT INTO `pic_`.`test` (`n`, `m`, `x`) VALUES ('100000', '100000', '100000');
INSERT INTO `pic_`.`test` (`n`, `m`, `x`) VALUES ('1000000', '1000000', '1000000');

测试结果 查询结果

mysql> select * from test;
+---------+---------+-------------+
| n       | m       | x           |
+---------+---------+-------------+
|      01 |  000001 | 00000000001 |
|      10 |  000010 | 00000000010 |
|    1000 |  001000 | 00000001000 |
|   10000 |  010000 | 00000010000 |
|  100000 |  100000 | 00000100000 |
| 1000000 | 1000000 | 00001000000 |
+---------+---------+-------------+
6 rows in set (0.00 sec)

结论

从上面的结果得出 intlength 不能决定存储数据的精度。配合 zerofill 可以决定返回结果 至少是 length 的位数,但是,精度(或者数据)无损。

下面说下我对整型中绝对精度的理解

MySQL 类型 占用字节数 占用位数 默认长度 有符号范围 无符号范围
tinyint 1 8 4 -128 ~ 127 0 ~ 255
smallint 2 16 6 -32768 ~ 32767 0 ~ 63335
int 4 32 11 -2147483648 ~ 2147483647 0 ~ 4294836225
big 8 64 20 -9223372036854775808 ~ 9223372036854775807 0 ~ 18446744073709552000

计算方法

硬盘中存储数据的时候,一个字节占用8位,一位中存储的数据就是 0 || 1,我上面表格中有一列是占用位数, 后面计算范围的时,我们通过这个位数来计算,

有符号,代表可以表示正负,而这个符号,占用一位存储空间,

我们使用 tinyint 做例子计算下范围。

从上表中得出,tinyint 占用8位

有符号范围可以表示为 2^7 ~ 2^7 - 1 计算结果是:-128 ~ 127。 后面因为 0 属于没符号的范围,所以需要减一;

无符号范围可以表示为 0 ~ 2^8 计算结果是:0 ~ 255

阿杰博客
请先登录后发表评论
  • latest comments
  • 总共0条评论