De (1) tussen haakjes voor een MySQL integer-type heeft niets te maken met het waardenbereik dat door het datatype wordt geaccepteerd, of hoe het wordt opgeslagen. Het is alleen voor weergave.
Zie ook mijn antwoord op Typen in MySQL:BigInt(20) vs Int(20) enz. .
TINYINT verschilt niet van TINYINT(1) of TINYINT(2) of TINYINT(64). Het is een 8-bits geheel getal met teken en accepteert elke 8-bits integerwaarde van -128 tot 127.
mysql> create table b (i tinyint(1));
mysql> insert into b values (42);
mysql> select * from b;
+------+
| i |
+------+
| 42 |
+------+
Voor het gemak ondersteunt MySQL een alias voor BOOL, die onmiddellijk wordt vervangen door 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
Zoals ik al zei, betekent het gebruik van (1) bijna niets, het is slechts een conventie, zodat als je TINYINT(1) ziet, het redelijk is om aan te nemen dat de kolom bedoeld is als boolean te gebruiken. Maar niets in MySQL weerhoudt u ervan andere integerwaarden erin op te slaan.
Als u wilt dat een kolom alleen . accepteert 0 of 1, u kunt BIT(1) gebruiken:
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
Dit bespaart echter geen ruimte in vergelijking met TINYINT, omdat de opslag voor een bepaalde kolom naar boven wordt afgerond op de dichtstbijzijnde byte.
PS:Ondanks het antwoord van @samdy1, slaat TINYINT geen strings op '0'
of '1'
helemaal niet, het slaat gehele getallen op 0
of 1
, evenals andere gehele getallen van -128 tot 127. Het is niet nodig om gehele getallen te citeren in SQL, en ik vraag me vaak af waarom zoveel ontwikkelaars dat doen.