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)
结论
从上面的结果得出 int
的 length
不能决定存储数据的精度。配合 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
。
评论已关闭