(1) в скоби за MySQL целочислен тип няма нищо общо с диапазона от стойности, приети от типа данни, или как се съхранява. Това е само за показване.
Вижте също моя отговор на Типове в MySQL:BigInt(20) срещу Int(20) и т.н. .
TINYINT не се различава от TINYINT(1) или TINYINT(2) или TINYINT(64). Това е 8-битов подписан целочислен тип данни и приема всяка 8-битова целочислена стойност от -128 до 127.
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, тъй като паметта за дадена колона се закръгля до най-близкия байт.
PS:Въпреки отговора от @samdy1, TINYINT не съхранява низове '0'
или '1'
изобщо, той съхранява цели числа 0
или 1
, както и други цели числа от -128 до 127. Няма нужда да цитирате цели числа в SQL и често съм озадачен защо толкова много разработчици го правят.