MySQL学习笔记――数据类型之整数类型

本文大部分内容摘自《MySQL入门很简单》。


整数类型 字节数 无符号数的取值范围 有符号数的取值范围
tinyint 1 0~255

-128~+127

smallint 2 0~65535 -32768~+32767
mediumint 3 0~167777215 -8388608~+8388607
int 4 0~4294967295 -2147483648~+2147483647
integer 4 0~4294967295 -2147483648~+2147483647
bigint 8 0~18446744073709551615
-922337203685475808~+922337203685475807

       从上表可知,int类型和integer类型的字节数和取值范围都是一样的,其实,在MySQL中int类型和integer类型是一样的,即使你为某个字段指定了integer数据类型,最后用desc语句显示表结构时它显示的还是int类型,不信可以试试哦。

       不同整数类型的字节数不同,根据类型所占的字节数可以算出该类型的取值范围,例如,tinyint类型的字节数是1,1个字节是8位,那么,tinyint类型的无符号数的最大值为2^8-1,即为255,而有符号数的最大值为2^7-1,即为127。同理可以算出其他不同整数类型的取值范围。

       MySQL支持数据类型后面指定该类型的显示宽度,比如:tinyint(4)。每个整数类型都有默认显示宽度,所以即使你不指定显示宽度也不会有什么影响。我们来做个实验验证一下吧。

mysql> create table test(a tinyint,b smallint,c mediumint,d int,e integer,f bigint);
Query OK, 0 rows affected (0.21 sec)

mysql> desc test;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| a     | tinyint(4)   | YES  |     | NULL    |       |
| b     | smallint(6)  | YES  |     | NULL    |       |
| c     | mediumint(9) | YES  |     | NULL    |       |
| d     | int(11)      | YES  |     | NULL    |       |
| e     | int(11)      | YES  |     | NULL    |       |
| f     | bigint(20)   | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
6 rows in set (0.10 sec)

mysql>

从上面这个实验可知:

  1. 为字段指定integer类型后确实会转化成int类型;

  2. 每个整数类型都有其默认的显示宽度。

       聪明的童鞋应该会发现默认的显示宽度跟整数类型的取值范围有关,而且无符号数和有符号数的默认显示宽度是不一样的,下面介绍的unsigned属性就是用来设置无符号数的。举个例子说明一下吧,tinyint类型的有符号数的默认显示宽度是4,那是因为它的有符号数的取值范围是-128~+127,而tinyint类型的无符号数的取值范围是0~255,所以tinyint类型的无符号数的默认显示宽度是3。

       有人可能会问显示宽度的取值范围是多少,其实只要大于等于0即可,即使比该整数类型的默认显示宽度还大也没问题,当你将显示宽度设为0时,MySQL会自动为数据类型指定默认的显示宽度,所以说,没人会干这种画蛇添足的傻事,没事别给整数类型指定0显示宽度哦,不然会让别人鄙视的,呵呵。

       那么,显示宽度有什么用呢?目前为止,我只发现在指定了zerofill属性后才能体现出显示宽度的作用,zerofill属性的作用是以0补全宽度,而且当你为字段指定了zerofill属性后,MySQL会自动给字段增加unsigned属性,该属性表示无符号,这样说大家可能不太好理解,我们来做个实验吧。

mysql> create table test(a tinyint zerofill);
Query OK, 0 rows affected (0.10 sec)

mysql> desc test;
+-------+------------------------------+------+-----+---------+-------+
| Field | Type                         | Null | Key | Default | Extra |
+-------+------------------------------+------+-----+---------+-------+
| a     | tinyint(3) unsigned zerofill | YES  |     | NULL    |       |
+-------+------------------------------+------+-----+---------+-------+
1 row in set (0.02 sec)

mysql> insert into test values(1);
Query OK, 1 row affected (0.05 sec)

mysql> select * from test;
+------+
| a    |
+------+
|  001 |
+------+
1 row in set (0.00 sec)

mysql>

       从实验可知,当我们为字段指定了zerofill属性后,我们插入的数据会自动补0,且MySQL会自动添加unsigned属性,且整数类型的显示宽度会变成无符号数的默认显示宽度。

       还有一点,即使我们指定了显示宽度,我们依旧能插入比该宽度大的数据,下面我们来做个实验验证一下吧。

mysql> create table test(a int(4));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into test values(55555);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+-------+
| a     |
+-------+
| 55555 |
+-------+
1 row in set (0.00 sec)

mysql>

       介绍了这么多整数类型,那实际工作中我们该如何选择呢?是不是统一用int类型就好了?答案是根据实际情况来选择,不同的整数类型的字节数和取值范围不同,如果你确定你要插入的数据在0~255之间,那你就用tinyint类型吧,这样可以最大程度地节省空间和加快访问速度。

你可能感兴趣的:(mysql,数据类型)