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。