MySql: Tinyint (2) vs tinyint (1) - qual è la differenza?


183

Conoscevo booleano in mysql come tinyint (1).

Oggi vedo una tabella con un intero definito come tinyint(2), e anche altri come int(4), int(6)...

Che cosa significa la dimensione nel campo di tipo intero e tinyint?


4
Leggi i tipi di dati Integer MySQL qui .
Bud Damyanov,

2
La risposta di @AamirR è quella corretta
evilReiko,

1
@evilReiko zerofill non fa alcuna differenza nel modo in cui il valore viene archiviato, riguarda davvero la presentazione ... gli spazi o gli zero non fanno davvero differenza nella correttezza della risposta di nessuno imo
Ja͢ck

Risposte:


94

Significa larghezza di visualizzazione

Sia che usi tinyint (1) o tinyint (2), non fa alcuna differenza.

Uso sempre tinyint (1) e int (11), ho usato diversi client mysql (navicat, sequel pro).

Non significa assolutamente niente! Ho eseguito un test, tutti i client di cui sopra o anche il client della riga di comando sembra ignorarlo.

Tuttavia, la larghezza di visualizzazione è molto importante se si utilizza l' ZEROFILLopzione, ad esempio la tabella ha le seguenti 2 colonne:

Un piccolo zerofill (2)

B tinyint (4) zerofill

entrambe le colonne hanno il valore di 1, l'output per la colonna A sarebbe 01e 0001per B , come mostrato nello screenshot qui sotto :)

zerofill con displaywidth


20
Stranamente ho appena scoperto che nel connettore MySQL ufficiale C # tinyint (1) non restituisce mai valori diversi da 0 e 1. Questo probabilmente ha a che fare con il riconoscimento automatico di tinyint (1) come booleano. Solo un avvertimento a volte è importante.
Daniel Sharp,

Non è meglio usare un tipo intero e una lunghezza il più piccola possibile? Avevo l'impressione che questo salvasse memoria in MySQL.
nclsvh,

Come sottolinea Daniel-Sharp, potrebbe sembrare importante per i connettori. Ho appena avuto un problema con Hibernate utilizzando JDBC segnalando che interpretava un TINYINT (1) come un BIT.
sfj

2
@DanielSharp che probabilmente è dovuto all'opzione di connessione tinyInt1isBit che è impostata su true. Vedi dev.mysql.com/doc/connector-j/8.0/en/…
Parisbre56

1
Ho sempre pensato che ciò avesse a che fare con la quantità di numeri accettati (ad esempio, int (4) che non consentiva nulla al di sopra di 9999). Immagino di aver sempre pensato male allora. Sia nella riga di comando PHP che MySQL vedo bene il valore sopra di esso.
Joshua Bakker,

226

Il (m)indica la larghezza di visualizzazione della colonna; applicazioni come il client MySQL ne fanno uso quando mostrano i risultati della query.

Per esempio:

| v   | a   |  b  |   c |
+-----+-----+-----+-----+
| 1   | 1   |  1  |   1 |
| 10  | 10  | 10  |  10 |
| 100 | 100 | 100 | 100 |

Qui a, be cstanno usando TINYINT(1), TINYINT(2)e TINYINT(3)rispettivamente. Come puoi vedere, riempie i valori sul lato sinistro usando la larghezza del display.

È importante notare che non influisce sull'intervallo di valori accettato per quel particolare tipo, ovvero TINYINT(1)accetta comunque [-128 .. 127].


16
cosa significa "larghezza della colonna" ??
realtebo,

8
@realtebo viene utilizzato principalmente dal client della riga di comando mysql per scopi di visualizzazione.
Ja͢ck,

3
Il numero di "cifre" indicato dall'interfaccia. In altre parole, riempirà gli zeri a sinistra. Questo tipo di funzionalità aveva un senso all'inizio dei database, ma ora è solo un'eredità.
Denilson Sá Maia,

2
@Kailas Se non stai usando il client mysql? Proprio nessuno.
Ja͢ck,

11
@Kailas No! tinyint (1) non accetta solo 0-9. Accetta l'intera gamma di ciò che può contenere tinyint.
Ja͢ck,

18
mysql> CREATE TABLE tin3(id int PRIMARY KEY,val TINYINT(10) ZEROFILL);
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO tin3 VALUES(1,12),(2,7),(4,101);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tin3;
+----+------------+
| id | val        |
+----+------------+
|  1 | 0000000012 |
|  2 | 0000000007 |
|  4 | 0000000101 |
+----+------------+
3 rows in set (0.00 sec)

mysql>

mysql> SELECT LENGTH(val) FROM tin3 WHERE id=2;
+-------------+
| LENGTH(val) |
+-------------+
|          10 |
+-------------+
1 row in set (0.01 sec)


mysql> SELECT val+1 FROM tin3 WHERE id=2;
+-------+
| val+1 |
+-------+
|     8 |
+-------+
1 row in set (0.00 sec)

11
Modifica la tua risposta per includere alcune spiegazioni. Le risposte solo al codice fanno ben poco per educare i futuri lettori SO. La tua risposta è nella coda di moderazione per essere di bassa qualità.
mickmackusa,

14

Informazioni su INT, TINYINT ... Questi sono diversi tipi di dati, INT è un numero di 4 byte, TINYINT è un numero di 1 byte. Maggiori informazioni qui - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT .

La sintassi del tipo di dati TINYINT è TINYINT (M), dove M indica la larghezza massima di visualizzazione (utilizzata solo se il client MySQL lo supporta).

Attributi di tipo numerico .


1
cosa significa "larghezza di visualizzazione"!?
realtebo,

2
Dal riferimento - Ad esempio, INT (4) specifica un INT con una larghezza di visualizzazione di quattro cifre. Questa larghezza di visualizzazione facoltativa può essere utilizzata dalle applicazioni per visualizzare valori interi con una larghezza inferiore alla larghezza specificata per la colonna riempiendoli a sinistra di spazi.
Devart,

2
Ma non ho visto applicazioni o client MySQL che utilizzano questa funzionalità. Uso sempre INT (11) e utilizzo le funzioni di formattazione per personalizzare l'output.
Devart,
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.