mysql支持标准SQL中的数值类型,支持标准的整型类型INTEGER和SMALLINT,并且扩展了标准类型,也支持TINYINT、MEDIUMINT和BIGINT。下面的表格中是每个类型的存储范围。
mysql整型存储范围表
类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
TINYINT | 1 | -128 | 127 |
SMALLINT | 2 | -23768 | 32767 |
MEDIUMINT | 3 | -8388608 | 8388607 |
INTEGER | 4 | -2147483648 | 2147483647 |
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 |
在整数类型中,按照存储范围和存储方式,共分为5个类型,如果超出类型范围的操作会发生Out of range提示。比如下面的例子:我们建一个tInt表:字段为id1,id2,id3,分别为他们插入数据值1000,1000,1000。我们可以查看运行之后的结果:
mysql> create table tInt(
-> id1 TINYINT,
-> id2 SMALLINT,
-> id3 INTEGER
-> );
Query OK, 0 rows affected (0.12 sec)
mysql> insert into tInt values(1000,1000,1000);
ERROR 1264 (22003): Out of range value for column 'id1' at row 1
除此之外mysql还支持在类型名称的小括号内指定显示宽度,比如INTEGER(5)表示数值宽度小于5的时候在数字前面填满宽度,如果不指定显示宽度默认为INTEGER(11)。一般配合zerofill,用0填充。如下面的例子:创建表tInt1,字段为id1和id2,并且都插入数据1。
mysql> create table tInt1(
-> id1 INTEGER(5),
-> id2 INTEGER
-> );
Query OK, 0 rows affected (0.04 sec)
mysql>
mysql> insert into tInt1 values(1,1);
Query OK, 1 row affected (0.00 sec)
mysql> select * from tInt1;
+------+------+
| id1 | id2 |
+------+------+
| 1 | 1 |
+------+------+
1 row in set (0.00 sec)
我们可以看到插入的数据并没有任何异常,并且没有使用0填充,那是因为我们没有声明使用zerofill。下面我们修改表tInt1的字段。
mysql> alter table tInt1 modify id1 int zerofill;
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> alter table tInt1 modify id2 int(5) zerofill;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from tInt1;
+------------+-------+
| id1 | id2 |
+------------+-------+
| 0000000001 | 00001 |
+------------+-------+
1 row in set (0.00 sec)
我们可以看到不足的位数都是用0进行填充,那么,我们设置了宽度的限制,如果我们插入的数值超过了宽度的限制,会发生什么,会不会报错?我们继续对tInt1表进行操作,插入id1为1,id2为1111111我们可以看下面的代码。
mysql> insert into tInt1 values(1,1111111);
Query OK, 1 row affected (0.01 sec)
mysql> select * from tInt1;
+------------+---------+
| id1 | id2 |
+------------+---------+
| 0000000001 | 00001 |
| 0000000001 | 1111111 |
+------------+---------+
2 rows in set (0.00 sec)
我们可以看到并没有报错,所以虽然我们生明了宽度,但实际值并没有受宽度的限制。
所有整型类型都有一个可选的unsigned属性,如果声明此属性,则值最小为0,最大为原值的2倍。如果一个列生命为zerofill,则自动为该列添加unsigned属性。可看下面的案例。
mysql> create table tInt2(
-> id1 TINYINT,
-> id2 TINYINT UNSIGNED,
-> id3 TINYINT ZEROFILL
-> );
Query OK, 0 rows affected (0.03 sec)
mysql>
mysql> insert into tInt2 values(-33,255,255);
Query OK, 1 row affected (0.01 sec)
mysql>
mysql> select * from tInt2;
+------+------+------+
| id1 | id2 | id3 |
+------+------+------+
| -33 | 255 | 255 |
+------+------+------+
1 row in set (0.00 sec)
另外整数类型还有一个 AUTO_INCREMENT属性,自动增长,后面会做详细的介绍。