(1) w nawiasach dla typu integer MySQL nie ma nic wspólnego z zakresem wartości akceptowanych przez typ danych ani sposobem ich przechowywania. To tylko do wyświetlania.
Zobacz także moją odpowiedź na Typy w MySQL:BigInt(20) vs Int(20) itp .
TINYINT nie różni się od TINYINT(1), TINYINT(2) lub TINYINT(64). Jest to 8-bitowy ze znakiem typ danych całkowitych i akceptuje każdą 8-bitową liczbę całkowitą od -128 do 127.
mysql> create table b (i tinyint(1));
mysql> insert into b values (42);
mysql> select * from b;
+------+
| i |
+------+
| 42 |
+------+
Dla wygody MySQL obsługuje alias BOOL, który jest natychmiast zastępowany przez 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 powiedziałem, użycie (1) prawie nic nie znaczy, to tylko konwencja, więc jeśli widzisz TINYINT(1), rozsądne jest założenie, że kolumna jest przeznaczona do wykorzystania jako wartość logiczna. Ale nic w MySQL nie uniemożliwia przechowywania w nim innych wartości całkowitych.
Jeśli chcesz, aby kolumna akceptowała tylko 0 lub 1, możesz użyć 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
Nie oszczędza to jednak miejsca w porównaniu z TINYINT, ponieważ pamięć dla danej kolumny jest zaokrąglana do najbliższego bajtu.
PS:Pomimo odpowiedzi od @samdy1, TINYINT nie przechowuje ciągów '0'
lub '1'
w ogóle przechowuje liczby całkowite 0
lub 1
, a także inne liczby całkowite od -128 do 127. Nie ma potrzeby cytowania liczb całkowitych w SQL i często zastanawia mnie, dlaczego tak wielu programistów to robi.