O (1) entre parênteses para um tipo inteiro do MySQL não tem nada a ver com o intervalo de valores aceitos pelo tipo de dados ou como ele é armazenado. É apenas para exibição.
Veja também minha resposta para Types in MySQL:BigInt(20) vs Int(20) etc .
TINYINT não é diferente de TINYINT(1) ou TINYINT(2) ou TINYINT(64). É um tipo de dados inteiro com sinal de 8 bits e aceita qualquer valor inteiro de 8 bits de -128 a 127.
mysql> create table b (i tinyint(1));
mysql> insert into b values (42);
mysql> select * from b;
+------+
| i |
+------+
| 42 |
+------+
Por conveniência, o MySQL suporta um alias para BOOL, que é substituído imediatamente por 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
Como eu disse, o uso de (1) não significa quase nada, é apenas uma convenção para que, se você vir TINYINT(1), seja razoável supor que a coluna é destinada para ser usado como um booleano. Mas nada no MySQL impede que você armazene outros valores inteiros nele.
Se você deseja que uma coluna aceite somente 0 ou 1, você pode usar 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
No entanto, isso não economiza espaço em comparação com TINYINT, porque o armazenamento de uma determinada coluna é arredondado para o byte mais próximo.
PS:Apesar da resposta de @samdy1, TINYINT não armazena strings
'0'
ou '1'
em tudo, ele armazena inteiros 0
ou 1
, bem como outros inteiros de -128 a 127. Não há necessidade de citar inteiros em SQL, e muitas vezes fico intrigado com o motivo de tantos desenvolvedores o fazerem.