在mysql中创建整型字段int(或其它像tinyint)时,可以设定该字段的长度,如:
CREATE TABLE t1(id1 INT,id2 INT(5));
查看表结构信息:
mysql> DESC t1;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id1 | int(11) | YES | | NULL | |
| id2 | int(5) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
如果不指定长度,INT型默认长度为11。如果往该字段插入长度大于设定长度的数据,结果会怎样?MySQL会不会截断或者插不进去呢?
现往该表插入长度为7个1的值:
mysql> INSERT INTO t1(id1,id2) VALUES(1111111,1111111);
查看结果如下:
mysql> SELECT * FROM t1;
+---------+---------+
| id1 | id2 |
+---------+---------+
| 1 | 1 |
| 1111111 | 1111111 |
+---------+---------+
2 rows in set (0.00 sec)
得出结论,MySQL插入成功,不会截断,还是按照类型的实际精度进行保存。
整型字段有个ZEROFILL属性,在数字长度不够的数据前面填充0,以达到设定的长度,下面给上面的两个字段id1和id2分别设置该属性:
ALTER TABLE t1 MODIFY id1 INT ZEROFILL;
ALTER TABLE t1 MODIFY id2 INT(5) ZEROFILL;
mysql> DESC t1;
+-------+---------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------------+------+-----+---------+-------+
| id1 | int(10) unsigned zerofill | YES | | NULL | |
| id2 | int(5) unsigned zerofill | YES | | NULL | |
+-------+---------------------------+------+-----+---------+-------+
再往t1表插入两个长度为1的数据,如下:
mysql> INSERT INTO t1(id1,id2) VALUES(1,1);
查看结果如下:
mysql> SELECT * FROM t1;
+------------+---------+
| id1 | id2 |
+------------+---------+
| 0000000001 | 00001 |
| 0001111111 | 1111111 |
+------------+---------+
加上ZEROFILL属性后,MySQL会在数据前面补0以达到设置的长度。
zerofill,字面上理解就是填充0.在MySQL列中使用zerofill,如插入int(4),你插入1,显示0001,你插入55555,显示也是55555,插入负数显示为0000,因为mysql自动增加UNSIGNED属性 UNSIGNED不能为负数,当你插入负数时就显示0。
`pay_type` tinyint(4) unsigned zerofill NOT NULL DEFAULT '0000' COMMENT '支付方式:1卷皮系统 2支付宝 3银联 4财付通 ……'