(1) v závorkách pro celočíselný typ MySQL nemá nic společného s rozsahem hodnot akceptovaných datovým typem nebo s tím, jak je uložen. Je to pouze pro zobrazení.
Viz také moje odpověď na Zadejte MySQL:BigInt(20) vs Int(20) atd .
TINYINT se neliší od TINYINT(1) nebo TINYINT(2) nebo TINYINT(64). Je to datový typ 8bitového celého čísla se znaménkem a přijímá jakoukoli 8bitovou celočíselnou hodnotu od -128 do 127.
mysql> create table b (i tinyint(1));
mysql> insert into b values (42);
mysql> select * from b;
+------+
| i |
+------+
| 42 |
+------+
Pro pohodlí MySQL podporuje alias pro BOOL, který je okamžitě nahrazen 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
Jak jsem řekl, použití (1) neznamená téměř nic, je to pouze konvence, takže pokud uvidíte TINYINT(1), je rozumné předpokládat, že sloupec je zamýšlený být použit jako boolean. Ale nic v MySQL vám nebrání v tom ukládat další celočíselné hodnoty.
Pokud chcete, aby sloupec akceptoval pouze 0 nebo 1, můžete použít 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
To však nešetří místo ve srovnání s TINYINT, protože úložiště pro daný sloupec se zaokrouhluje na nejbližší bajt nahoru.
PS:Navzdory odpovědi od @samdy1 TINYINT neukládá řetězce '0'
nebo '1'
vůbec, ukládá celá čísla 0
nebo 1
, stejně jako další celá čísla od -128 do 127. V SQL není nutné citovat celá čísla a často si lámu hlavu nad tím, proč to tolik vývojářů dělá.