(1) i parentes for en MySQL-heltalstype har intet at gøre med rækken af værdier, der accepteres af datatypen, eller hvordan den er gemt. Det er kun til visning.
Se også mit svar på Indtastning MySQL:BigInt(20) vs Int(20) osv. .
TINYINT er ikke forskellig fra TINYINT(1) eller TINYINT(2) eller TINYINT(64). Det er en 8-bit heltalsdatatype med fortegn, og den accepterer enhver 8-bit heltalsværdi fra -128 til 127.
mysql> create table b (i tinyint(1));
mysql> insert into b values (42);
mysql> select * from b;
+------+
| i |
+------+
| 42 |
+------+
For nemheds skyld understøtter MySQL et alias for BOOL, som straks erstattes af 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
Som jeg sagde, betyder brugen af (1) næsten ingenting, det er kun en konvention, så hvis du ser TINYINT(1), er det rimeligt at antage, at kolonnen er tilsigtet skal bruges som boolean. Men intet i MySQL forhindrer dig i at gemme andre heltalsværdier i den.
Hvis du ønsker, at en kolonne kun skal acceptere 0 eller 1, kan du bruge 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
Dette sparer dog ikke plads sammenlignet med TINYINT, fordi lageret for en given kolonne rundes op til den nærmeste byte.
PS:På trods af svar fra @samdy1 gemmer TINYINT ikke strenge '0'
eller '1'
i det hele taget gemmer den heltal 0
eller 1
, såvel som andre heltal fra -128 til 127. Der er ingen grund til at citere heltal i SQL, og jeg undrer mig ofte over, hvorfor så mange udviklere gør det.