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)是相同的。
所以一般而言,该数字对整数类型的计算和存储影响不大,应更着重于整数类型的选择。