Qual è il significato di tinyint (N)?


17

Quando utilizziamo una lunghezza argomento con tipi di dati numerici, per quanto ne so questo specifica la larghezza di visualizzazione.
Ho provato quanto segue:

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)  

Innanzitutto tinyint ha un valore di 1 byte. Quindi qual è il significato di tinyint(4)? Non ci possono essere 4 cifre.

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)  

Vedo che in tinyint ho memorizzato un 10 e 101 e potrei recuperare questi valori nonostante sia definito come tinyint (1).
Non dovrei vedere un 1 per var1? Vale a dire solo 1 cifre sul display?


Perché hai due righe dopo un inserimento? Non riesco a comprendere appieno questo codice.
Woodrow Shigeru,

Risposte:


24

Data-saggio, tinyint(1), tinyint(2), tinyint(3)ecc sono tutti esattamente lo stesso. Sono tutti nell'intervallo da -128 a 127 per SIGNEDo 0-255 per UNSIGNED. Come notato da altre risposte, il numero tra parentesi è semplicemente un suggerimento per la larghezza del display.

Potresti voler notare, tuttavia, che application = le cose sagge potrebbero apparire diverse. Qui, tinyint(1)può assumere un significato speciale. Ad esempio, il connettore / J (connettore Java) considera tinyint(1)un valore booleano e invece di restituire un risultato numerico all'applicazione, converte i valori in truee false. questo può essere modificato tramite il tinyInt1isBit=falseparametro di connessione.


13

Un tinyint (1) può contenere numeri nell'intervallo da -128 a 127, poiché il tipo di dati è 8 bit (1 byte) - ovviamente un tinyint senza segno può contenere valori da 0 a 255.

Troncerà silenziosamente i valori fuori intervallo:

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>

... a meno che non modifichi sql_modeo cambi la configurazione del server:

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>

Il valore utilizzato nel DDL per il tipo di dati (ad esempio: tinyint (1)) è, come sospettavi, la larghezza di visualizzazione. Tuttavia, è facoltativo e i client non devono usarlo. Il client MySQL standard non lo utilizza, ad esempio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.