Jakie jest znaczenie tinyint (N)?

17

Kiedy używamy długości argumentu z numerycznymi typami danych, o ile wiem, określa szerokość wyświetlania.
Próbowałem następujące:

mysql> create table boolean_test (var1 boolean, var2 tinyint);    
Query OK, 0 rows affected (0.10 sec)   

mysql> show create table boolean_test;   
+--------------+-------------------------   
| Table        | Create Table
+--------------+-------------------------  
| boolean_test | CREATE TABLE `boolean_test` (  
  `var1` tinyint(1) DEFAULT NULL,  
  `var2` tinyint(4) DEFAULT NULL  
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |   
+--------------+---------------------------  
1 row in set (0.00 sec)  

Przede wszystkim tinyint ma wartość 1-bajtową. Jakie jest więc znaczenie tinyint(4)? Nie mogą być 4 cyfry.

mysql> insert into boolean_test values(101,112);  
Query OK, 1 row affected (0.03 sec)   

mysql> select * from boolean_test;  
+------+------+  
| var1 | var2 |  
+------+------+  
|   10 |  112 |  
|  101 |  112 |  
+------+------+  
2 rows in set (0.00 sec)  

Widzę, że w tinyint zapisałem 10 i 101 i mogłem odzyskać te wartości, mimo że jest to zdefiniowane jako tinyint (1).
Czy nie powinienem zobaczyć 1 var1? Czyli 1 wyświetla cyfry?

Cratylus
źródło
Dlaczego masz dwa wiersze po jednej wkładce? Nie mogę w pełni zrozumieć tego kodu.
WoodrowShigeru

Odpowiedzi:

24

Dane mądry, tinyint(1), tinyint(2), tinyint(3)itd. Są dokładnie takie same. Wszystkie są w zakresie od -128 do 127 dla SIGNEDlub 0-255 dla UNSIGNED. Jak zauważyły ​​inne odpowiedzi, liczba w nawiasach jest jedynie wskazówką dotyczącą szerokości wyświetlacza.

Warto jednak zauważyć, że aplikacja = 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ść logiczną i zamiast zwracać wynik liczbowy do aplikacji, konwertuje wartości na truei false. można to zmienić za pomocą tinyInt1isBit=falseparametru połączenia.

Shlomi Noach
źródło
13

Malutki (1) może przechowywać liczby w zakresie od -128 do 127, ponieważ typ danych to 8 bitów (1 bajt) - oczywiście niepodpisany malutki może przechowywać wartości 0-255.

Po cichu obcina wartości poza zakresem:

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_modelub zmienisz 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żyta w DDL dla typu danych (np .: tinyint (1)) to, jak można się spodziewać, szerokość wyświetlania. Jest to jednak opcjonalne i klienci nie muszą go używać. Na przykład standardowy klient MySQL go nie używa.

Philᵀᴹ
źródło