大家在初识mysql的时候有没有注意到,当你创建一个表时,如果表中有数值类型,比如int,mysql会自动在int类型后面加上(11),于是你看到的字段类型就变成了int(11),如果你指定的int类型的长度,系统会保留你指定的长度。
比如我们创建表:
create table t1 (
col1 int(8),
col2 int
) engine=InnoDB charset=utf8 comment='测试数值类型括号中数字';
查询建表语句得到结果如下:
mysql> show create table t1;
+-------+-------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`col1` int(8) unsigned zerofill NOT NULL,
`col2` int(11) unsigned zerofill DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试数值类型括号中的数字作用' |
+-------+-------------------------------------------------------------------+
此时,不知道有多少人有过疑问,如果int后面能指定长度,那不就是和oracle的number类型一样了吗?那为什么还要有tinyint,bigint之类的类型呢?于是,我们在测试:
insert into t1 value (12345678, 12345678);
查询结果没问题
Query OK, 1 row affected (0.01 sec)
再次插入更长的值
insert into t1 value (1234567890, 1234567890);
执行结果仍然没问题
Query OK, 1 row affected (0.01 sec)
查询结果发现,col1和col2中的数据也是正常的
mysql> select * from t1;
+------------+------------+
| col1 | col2 |
+------------+------------+
| 12345678 | 12345678 |
| 1234567890 | 1234567890 |
+------------+------------+
2 rows in set (0.00 sec)
数值类型是int(8)的字段col1中数据和col2中数据是一样的,现在col1中的长度已经大于8了。
再次增加插入数据的长度后,我们发现数据出现了警告,并且查询结果也和插入不一致,插入的12345678901都变成了2147483647,这和int的最大值(-2147483648, 2147483647)是一致的。但是col1和col2仍然是一样的。
mysql> insert into t1 value (12345678901, 12345678901);
Query OK, 1 row affected, 2 warnings (0.01 sec)
mysql> select * from t1;
+------------+------------+
| col1 | col2 |
+------------+------------+
| 12345678 | 12345678 |
| 1234567890 | 1234567890 |
| 2147483647 | 2147483647 |
+------------+------------+
3 rows in set (0.00 sec)
看来int(8)和int(11)并没有什么区别。
我们再次修改一下两个字段的属性:
ALTER TABLE test.t1 CHANGE COLUMN col1col1INT(8) ZEROFILL NULL DEFAULT NULL ,
CHANGE COLUMN col2col2INT(11) ZEROFILL NULL DEFAULT NULL ;
再次查询发现了端倪:
mysql> insert into t1 value (1234, 1234);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1;
+------------+-------------+
| col1 | col2 |
+------------+-------------+
| 12345678 | 00012345678 |
| 1234567890 | 01234567890 |
| 2147483647 | 02147483647 |
| 00001234 | 00000001234 |
+------------+-------------+
4 rows in set (0.00 sec)
数据类型后括号中的数字是在具有zerofiil属性的时候用的。