TINYINT(1) 和 TINYINT(5) 和 TINYINT(12) 或任何其他长度实际上存储完全相同。它们都是 8 位有符号整数。它们支持从 -128 到 127 的整数值。如果列被定义为无符号整数,则支持从 0 到 255 的值。
那么“长度”参数是什么?没有什么。它不会影响整数的大小或位数或值的范围。论据是一个显示提示只要。除非您使用 ZEROFILL 选项,否则它是无用的。
mysql> create table mytable (i1 tinyint(1) zerofill, i2 tinyint(5) zerofill, i3 tinyint(12) zerofill);
Query OK, 0 rows affected (0.04 sec)
mysql> insert into mytable values (255,255,255);
Query OK, 1 row affected (0.02 sec)
mysql> select * from mytable;
+------+-------+--------------+
| i1 | i2 | i3 |
+------+-------+--------------+
| 255 | 00255 | 000000000255 |
+------+-------+--------------+
ZEROFILL 选项强制该列是无符号的,当您查询该列时,它会将结果用零填充到您为该列定义的长度。零不存储在数据库中,它们仅在您获取查询结果时添加。
整数的“长度”参数具有误导性,它会给 MySQL 用户带来很多困惑。事后看来,使用TINYINT ZEROFILL(12) 之类的语法会更好,但现在更改它为时已晚。