AlwaysBeFriday 的博客

记录精彩的程序人生 开始使用

mysql 整数类型

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);

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> 

null

使用zerofill时,由于建表时设置了INT(5),会显示5位数字,而插入3位数123时,会有两位用0补足

根据《高性能MySQL》4.1.1,MySQL可以位整数类型指定宽度,例如INT(11),对大多数应用这是没有意义的:它不会限制值的合法范围,只是规定了MySQL的一些交互工具(例如MySQL命令行客户端)用来显示字符的个数。对于存储和计算来说,INT(1)和INT(20)是相同的。

所以一般而言,该数字对整数类型的计算和存储影响不大,应更着重于整数类型的选择。

评论
留下你的脚步