M

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

xyj2156 数据库 2018-07-30

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 类型占用字节数占用位数默认长度有符号范围无符号范围
tinyint184-128 ~ 1270 ~ 255
smallint2166-32768 ~ 327670 ~ 63335
int43211-2147483648 ~ 21474836470 ~ 4294836225
big86420-9223372036854775808 ~ 92233720368547758070 ~ 18446744073709552000

计算方法

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

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

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

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

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

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

PREV
centos 7.3 源码编译 samba
NEXT
Apache htpasswd 添加 SVN帐户

评论(0)

评论已关闭