在 MySQL 中,zerofill 字段约束表示用零填充,配合整型后面的小括号中的数值一起生效。
整型后面的小括号中的数值,用于指定整型数据的长度(宽度)。
若使用了 zerofill,当实际长度达不到指定的显示长度时,就会用 0 在前面补齐。
对于 tinyint 数据类型,只占 1 个字节:
- 无符号的(unsigned),范围是 0 到 255,默认长度是 3。
- 有符号的(signed),范围是 -128 到 127,默认长度是 4。
测试示例
先创建一张测试表,对 tinyint 类型都使用 zerofill。
CREATE TABLE `pre_demo` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`unsigned_t` tinyint(3) unsigned zerofill NOT NULL DEFAULT '000',
`signed_t` tinyint(4) unsigned zerofill NOT NULL DEFAULT '0000',
`t1` tinyint(1) unsigned zerofill NOT NULL DEFAULT '0',
`t2` tinyint(2) unsigned zerofill NOT NULL DEFAULT '00',
`t3` tinyint(3) unsigned zerofill NOT NULL DEFAULT '000',
`t4` tinyint(4) unsigned zerofill NOT NULL DEFAULT '0000',
`t5` tinyint(5) unsigned zerofill NOT NULL DEFAULT '00000',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
然后,插入测试数据。
NSERT INTO pre_demo VALUES(NULL,8,8,8,8,8,8,8);
INSERT INTO pre_demo VALUES(NULL,123,123,123,123,123,123,123);
最后,查询数据表中的数据。
mysql> SELECT * FROM pre_demo;
+----+------------+----------+-----+-----+-----+------+-------+
| id | unsigned_t | signed_t | t1 | t2 | t3 | t4 | t5 |
+----+------------+----------+-----+-----+-----+------+-------+
| 1 | 008 | 0008 | 8 | 08 | 008 | 0008 | 00008 |
| 2 | 123 | 0123 | 123 | 123 | 123 | 0123 | 00123 |
+----+------------+----------+-----+-----+-----+------+-------+
2 rows in set (0.00 sec)
mysql> SELECT *,LENGTH(id),LENGTH(unsigned_t),LENGTH(t1) FROM pre_demo;
+----+------------+----------+-----+-----+-----+------+-------+------------+--------------------+------------+
| id | unsigned_t | signed_t | t1 | t2 | t3 | t4 | t5 | LENGTH(id) | LENGTH(unsigned_t) | LENGTH(t1) |
+----+------------+----------+-----+-----+-----+------+-------+------------+--------------------+------------+
| 1 | 008 | 0008 | 8 | 08 | 008 | 0008 | 00008 | 1 | 3 | 1 |
| 2 | 123 | 0123 | 123 | 123 | 123 | 0123 | 00123 | 1 | 3 | 3 |
+----+------------+----------+-----+-----+-----+------+-------+------------+--------------------+------------+
2 rows in set (0.00 sec)
总结
- tinyint(1) 与 tinyint(3) 能够存储的数据范围是一样的,都是 0 到 255(无符号的)。区别在于,当使用 zerofill 时,查询结果显示的长度可能不同。
- zerofill 和 指定长度配合使用,可用于统一数据的显示长度,比如在数据库层面快速生成统一长度的流水号。
- 一般情况下,无须刻意指定整型数据类型的长度。使用 MySQL 的默认长度即可。