1.类型选择
根据 mysql 手册, MySQL 支持的整数类型所需的存储和范围:
类型 | 存储(字节) | 最小值签名 | 最小值无符号 | 最大值签名 | 最大值无符号 |
---|---|---|---|---|---|
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 | -263 |
0 |
263-1 |
264-1 |
由该表可知:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT 分别使用 1,2,3,4,8 个字节用于存储,而一个字节为 8 位,也就是说该五个类型分别使用 8,16,24,32,64 位存储空间。
存储的值的范围为-2^(N-1)~2^(N-1)-1,如果是无符号 UNSIGNED,则存储的值范围为 2^(N)-1,N 为位数。整数类型由可选的 UNSIGNED 属性,意为不允许负值,可将正数的上限大致提高一倍。
比如:
TINYINT,使用 1 个字节,即使用 1*8=8 位,即-2^(8-1) ~ 2^(8-1)-1,即-128~127;如果位 UNSIGNED(无符号),则为 0~2^(8)-1,即 0~255。
INT,使用 4 个字节,即使用 4*8=32 位,即-2^(32-1) ~ 2^(32-1)-1,即-2147483648~2147483647;如果位 UNSIGNED(无符号),则为 0~2^(32)-1,即 0~4294967296。
由此可知在创建数据表时,可根据插入数据的大小来选择整数类型,如果数字为 0~255,即可选择 tinyint,如果数字为 0~4294967296,则可选择 INT,选用存储字节更多的类型可以存储较小的数字,但这样会占用更多的磁盘,内存和 cpu 缓存,比如,使用 INT 存储数字 255,实际数字只需要 1 个字节,但 INT 类会使用 4 个字节去存储该数字,这样会造成浪费。
所以应尽量选取符合需求的整数类型,如果无法确定哪个数据类型,就选择不会超过范围的最小的类型。
2.表示宽度
在创建数据表时,经常会在类型后加入一个数字:
create table test(
num int(10) not null);
这个数字并不会限制存储数据的范围,限制存储数据范围的是数据类型,比如 TINYINT(UNSIGNED)只能存数字 0~255。
INT(10)括号内的数字,是为整数类型指定宽度,也可以理解为一个数字显示的位数。
mysql> create table test( num int(5) zerofill not null);
Query OK, 0 rows affected (0.06 sec)
mysql> insert into test(num) values(123);
Query OK, 1 row affected (0.01 sec)
mysql> select * from test;
+-------+
| num |
+-------+
| 00123 |
+-------+
1 row in set (0.00 sec)
mysql>
使用 zerofill 时,由于建表时设置了 INT(5),会显示 5 位数字,而插入 3 位数 123 时,会有两位用 0 补足
根据《高性能 MySQL》4.1.1,MySQL 可以位整数类型指定宽度,例如 INT(11),对大多数应用这是没有意义的:它不会限制值的合法范围,只是规定了 MySQL 的一些交互工具(例如 MySQL 命令行客户端)用来显示字符的个数。对于存储和计算来说,INT(1)和 INT(20)是相同的。
所以一般而言,该数字对整数类型的计算和存储影响不大,应更着重于整数类型的选择。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于