phpMyAdmin
 sql >> Base de Dados >  >> Database Tools >> phpMyAdmin

Por que TINYINT(1) funciona como um booleano, mas INT(1) não?


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.