MySQL整数类型括号中的数字(1)与数据类型接受的值的范围或存储方式无关,仅用于显示。
请参阅我的答案:Types in MySQL: BigInt(20) vs Int(20) etc。
TINYINT与TINYINT(1)、TINYINT(2)或TINYINT(64)没有任何区别。它是一个8位带符号整数数据类型,并且可以接受从-128到127的任何8位整数值。
mysql> create table b (i tinyint(1));
mysql> insert into b values (42);
mysql> select * from b;
+
| i |
+
| 42 |
+
为了方便起见,MySQL支持BOOL的别名,该别名立即被TINYINT(1)替换。
mysql> create table b2 (i bool);
mysql> show create table b2;
CREATE TABLE `b2` (
`i` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
正如我之前所说,使用(1)几乎没有任何意义,它只是一个惯例,因此如果您看到TINYINT(1),合理地假设该列旨在用作布尔值。但是MySQL中没有任何限制阻止您在其中存储其他整数值。
如果您希望列仅接受0或1,则可以使用BIT(1):
mysql> create table b3 (i bit(1));
mysql> insert into b3 values (0), (1);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> insert into b3 values (-1);
ERROR 1406 (22001): Data too long for column 'i' at row 1
mysql> insert into b3 values (2);
ERROR 1406 (22001): Data too long for column 'i' at row 1
然而,与TINYINT相比,这并没有节省任何空间,因为给定列的存储会舍入到最近的字节。
附注:尽管@samdy1的回答如此,但TINYINT并不存储字符串'0'或'1',它存储整数0或1,以及从-128到127的其他整数。在SQL中不需要引用整数,我经常感到困惑为什么许多开发人员会这样做。