MySql: Tinyint (2) vs tinyint (1) - was ist der Unterschied?

181

Ich kannte Boolesch in MySQL als tinyint (1).

Heute sehe ich eine Tabelle mit definierten eine ganze Zahl wie tinyint(2), und auch andere mögen int(4), int(6)...

Was bedeutet die Größe im Feld vom Typ Integer und Winzling?

Realtebo
quelle
4
Lesen Sie mehr über MySQL Integer - Datentypen hier .
Bud Damyanov
2
@ AamirRs Antwort ist die richtige
evilReiko
1
@evilReiko zerofill macht auch keinen Unterschied in der Art und Weise, wie der Wert gespeichert wird, es geht wirklich um Präsentation ... Leerzeichen oder Nullen machen keinen Unterschied in der Richtigkeit der Antwort von irgendjemandem imo
Ja͢ck

Antworten:

93

Dies bedeutet Anzeigebreite

Ob Sie tinyint (1) oder tinyint (2) verwenden, spielt keine Rolle.

Ich benutze immer tinyint (1) und int (11), ich habe mehrere MySQL-Clients verwendet (Navicat, Sequel Pro).

Es bedeutet überhaupt nichts! Ich habe einen Test durchgeführt, alle oben genannten Clients oder sogar der Befehlszeilenclient scheinen dies zu ignorieren.

Die Anzeigebreite ist jedoch am wichtigsten, wenn Sie die ZEROFILLOption verwenden. Ihre Tabelle enthält beispielsweise die folgenden zwei Spalten:

Eine winzige Nullfüllung (2)

B tinyint (4) zerofill

Beide Spalten haben den Wert 1, die Ausgabe für Spalte A wäre 01und 0001für B , wie im folgenden Screenshot gezeigt :)

Nullfüllung mit Anzeigebreite

AamirR
quelle
20
Seltsamerweise habe ich gerade entdeckt, dass tinyint (1) im offiziellen MySQL-Connector von C # niemals andere Werte als 0 und 1 zurückgibt. Dies hat wahrscheinlich damit zu tun, dass tinyint (1) automatisch als Boolescher Wert erkannt wird. Nur ein Kopf hoch, manchmal ist es wichtig.
Daniel Sharp
Ist es nicht besser, einen ganzzahligen Typ und eine möglichst kleine Länge zu verwenden? Ich hatte den Eindruck, dass dieser Speicher in MySQL gespeichert wurde.
nclsvh
Wie @ Daniel-Sharp betont, könnte es für Steckverbinder von Bedeutung sein. Hatte gerade ein Problem mit Hibernate bei der Verwendung von JDBC-Berichten, bei denen ein TINYINT (1) als BIT interpretiert wurde.
SFJ
2
@DanielSharp, das wahrscheinlich an der Verbindungsoption tinyInt1isBit liegt, die standardmäßig true ist. Siehe dev.mysql.com/doc/connector-j/8.0/en/…
Parisbre56
1
Ich habe immer gedacht, dass dies etwas mit der Anzahl der akzeptierten Zahlen zu tun hat (zum Beispiel int (4), das nichts über 9999 zulässt). Ich denke, ich habe damals immer falsch gedacht. Sowohl in der PHP- als auch in der MySQL-Befehlszeile sehe ich den Wert darüber in Ordnung.
Joshua Bakker
224

Das (m)gibt die Spaltenanzeigebreite an; Anwendungen wie der MySQL-Client nutzen dies, wenn sie die Abfrageergebnisse anzeigen.

Beispielsweise:

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

Hier a, bund cverwendet TINYINT(1), TINYINT(2)und TINYINT(3)jeweils. Wie Sie sehen können, werden die Werte auf der linken Seite anhand der Anzeigebreite aufgefüllt.

Es ist wichtig zu beachten, dass dies keinen Einfluss auf den akzeptierten Wertebereich für diesen bestimmten Typ hat, dh TINYINT(1)weiterhin akzeptiert [-128 .. 127].

Jack
quelle
14
Was bedeutet es "Spaltenbreite"?
Realtebo
7
@realtebo wird hauptsächlich vom MySQL-Befehlszeilenclient für Anzeigezwecke verwendet.
Ja͢ck
3
Die Anzahl der von der Schnittstelle angezeigten "Ziffern". Mit anderen Worten, es werden links Nullen aufgefüllt. Diese Art von Funktion war in den Anfängen von Datenbanken sinnvoll, aber jetzt ist sie nur noch ein Vermächtnis.
Denilson Sá Maia
2
@Kailas Wenn Sie den MySQL-Client nicht verwenden? Überhaupt keine.
Ja͢ck
11
@ Kailas Nein! tinyint (1) akzeptiert nicht nur 0-9. Es akzeptiert die gesamte Bandbreite dessen, was tinyint halten kann.
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)
zloctb
quelle
11
Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung zu erhalten. Nur-Code-Antworten tragen sehr wenig dazu bei, zukünftige SO-Leser zu schulen. Ihre Antwort befindet sich in der Moderationswarteschlange, da sie von geringer Qualität ist.
Mickmackusa
14

Informationen zu INT, TINYINT ... Dies sind verschiedene Datentypen. INT ist eine 4-Byte-Nummer, TINYINT ist eine 1-Byte-Nummer. Weitere Informationen hier - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT .

Die Syntax des Datentyps TINYINT lautet TINYINT (M), wobei M die maximale Anzeigebreite angibt (wird nur verwendet, wenn Ihr MySQL-Client dies unterstützt).

Numerische Typattribute .

Devart
quelle
1
Was bedeutet "Anzeigebreite"?
Realtebo
2
Aus der Referenz - Zum Beispiel gibt INT (4) ein INT mit einer Anzeigebreite von vier Ziffern an. Diese optionale Anzeigebreite kann von Anwendungen verwendet werden, um ganzzahlige Werte mit einer Breite anzuzeigen, die kleiner als die für die Spalte angegebene Breite ist, indem sie mit Leerzeichen nach links aufgefüllt werden.
Devart
2
Ich habe jedoch keine Anwendungen oder MySQL-Clients gesehen, die diese Funktion verwenden. Ich benutze immer INT (11) und benutze Formatierungsfunktionen, um die Ausgabe anzupassen.
Devart