La (1) tra parentesi per un tipo intero MySQL non ha nulla a che fare con l'intervallo di valori accettato dal tipo di dati o con il modo in cui viene archiviato. È solo per la visualizzazione.
Vedi anche la mia risposta a Digita MySQL:BigInt(20) vs Int(20) ecc .
TINYINT non è diverso da TINYINT(1) o TINYINT(2) o TINYINT(64). È un tipo di dati intero con segno a 8 bit e accetta qualsiasi valore intero a 8 bit compreso tra -128 e 127.
mysql> create table b (i tinyint(1));
mysql> insert into b values (42);
mysql> select * from b;
+------+
| i |
+------+
| 42 |
+------+
Per comodità, MySQL supporta un alias per BOOL, che viene immediatamente sostituito da 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
Come ho detto, l'uso di (1) non significa quasi nulla, è solo una convenzione, quindi se vedi TINYINT(1) è ragionevole presumere che la colonna sia destinata da usare come booleano. Ma niente in MySQL ti impedisce di memorizzare altri valori interi al suo interno.
Se vuoi che una colonna accetti solo 0 o 1, puoi usare 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
Ciò non consente di risparmiare spazio rispetto a TINYINT, perché lo spazio di archiviazione per una determinata colonna viene arrotondato al byte più vicino.
PS:nonostante la risposta di @samdy1, TINYINT non memorizza stringhe '0'
o '1'
a tutti, memorizza interi 0
o 1
, così come altri numeri interi da -128 a 127. Non c'è bisogno di citare numeri interi in SQL, e spesso sono perplesso perché così tanti sviluppatori lo fanno.