Pod względem danych, tinyint(1)
, tinyint(2)
, tinyint(3)
itd. są dokładnie takie same. Wszystkie mieszczą się w zakresie od -128 do 127 dla SIGNED
lub 0-255 dla UNSIGNED
. Jak zauważyły inne odpowiedzi, liczba w nawiasie jest jedynie wskazówką dotyczącą szerokości wyświetlacza.
Możesz jednak zauważyć, że application=mądre rzeczy mogą wyglądać inaczej. Tutaj, tinyint(1)
może mieć szczególne znaczenie. Na przykład Connector/J (złącze Java) traktuje tinyint(1)
jako wartość logiczna i zamiast zwracać wynik liczbowy do aplikacji, konwertuje wartości na true
i false
. można to zmienić za pomocą tinyInt1isBit=false
parametr połączenia.
tinyint(1) może przechowywać liczby z zakresu -128 do 127, ponieważ typ danych to 8 bitów (1 bajt) - oczywiście tinyint bez znaku może przechowywać wartości 0-255.
Po cichu obcina wartości spoza zakresu:
mysql> create table a
-> (
-> ttt tinyint(1)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into a values ( 127 );
Query OK, 1 row affected (0.00 sec)
mysql> insert into a values ( -128 );
Query OK, 1 row affected (0.00 sec)
mysql> insert into a values ( 128 );
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into a values ( -129 );
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from a;
+------+
| ttt |
+------+
| 127 |
| -128 |
| 127 |
| -128 |
+------+
4 rows in set (0.00 sec)
mysql>
... chyba że zmienisz sql_mode
lub zmień konfigurację serwera:
mysql> set sql_mode=STRICT_ALL_TABLES;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into a values ( -129 );
ERROR 1264 (22003): Out of range value for column 'ttt' at row 1
mysql>
Wartość używana w DDL dla typu danych (np. tinyint(1)) jest, jak podejrzewałeś, szerokością wyświetlania. Jest to jednak opcjonalne i klienci nie muszą z niego korzystać. Na przykład standardowy klient MySQL go nie używa.
https://dev.mysql .com/doc/refman/5.1/en/integer-types.html
https://dev .mysql.com/doc/refman/5.0/en/numeric-type-overview.html
MySql:Tinyint (2 ) vs tinyint(1) — jaka jest różnica?