Wie groß ist die Spalte von int (11) in MySQL in Bytes?

488

Wie groß ist die Spalte int(11)in MySQL in Bytes?

Und Maximalwert, der in diesen Spalten gespeichert werden kann?

Gaurav
quelle
1
Mögliches Duplikat von Wie groß ist ein SQL Int (N)?
Cellepo
1
@cellepo eins ist generisches SQL, das andere ist spezifisch für MySQL (und dieses hat viel mehr Ansichten). Wenn Sie auf Betrugsjagd gehen möchten und ich sie schnell mit einer Stimme schließen möchte , besuchen Sie den SOBotics- Chat und rufen Sie mich an. Der zu schließende muss jedoch mysqlvor meiner Ankunft markiert werden . Thx
Drew
6
Hallo Leute. Es ist möglicherweise doppelt vorhanden, aber es ist suchfreundlicher. Die meisten Leute suchen so mit int (11). und es löst die Fragen anderer Menschen. Sie können die Anzahl der Ansichten im Vergleich zu anderen überprüfen. und Benutzer finden hier eine detailliertere Antwort.
Gaurav

Antworten:

685

Ein INTwird immer 4 Bytes sein, egal welche Länge angegeben ist.

  • TINYINT = 1 Byte (8 Bit)
  • SMALLINT = 2 Bytes (16 Bit)
  • MEDIUMINT = 3 Bytes (24 Bit)
  • INT = 4 Bytes (32 Bit)
  • BIGINT = 8 Bytes (64 Bit).

Die Länge gibt nur an, wie viele Zeichen beim Auswählen von Daten mit dem MySQL-Befehlszeilenclient aufgefüllt werden sollen. 12345 gespeichert als int(3)wird immer noch als 12345 int(10)angezeigt , aber wenn es gespeichert wurde , würde es immer noch als 12345 angezeigt, aber Sie hätten die Möglichkeit, die ersten fünf Ziffern aufzufüllen. Wenn Sie beispielsweise hinzufügen, wird ZEROFILLes als 0000012345 angezeigt.

... und der Maximalwert ist 2147483647 (signiert) oder 4294967295 (nicht signiert)

Matt MacLean
quelle
111
was bedeutet dann 11 in int (11) hier?
Gaurav
73
Spalte INT (4), Ganzzahl 1 wird NUR als 0001 angezeigt, wenn die Spalte auch als Nullfüllung angegeben wurde. Andernfalls wird es nur als Nummer 1 ohne zusätzliche Ziffern angezeigt. @Gaurav - mischen Sie nicht, wie MySQL Daten anzeigt und wie es speichert, das sind zwei verschiedene Dinge. Was Sie sehen, ist nicht das, was es wirklich sein könnte.
Michael JV
13
@ Michael Wow, wirklich interessant. Wenn Sie also eine Spalte INT (3) erstellen und einen Wert 5001 speichern, wird 5001 gespeichert, aber nur 1 angezeigt. Das wusste ich nicht.
Andrew Tweber
16
@andrewtweber: 5001wird angezeigt, 5001auch wenn das Feld als definiert ist INT(3). Siehe @priyabagus Antwort unten und hier .
go2null
10
Wenn Sie keine Länge für ganzzahlige Felder angeben, legt MySQL einen Standardwert fest (tinyint 4, smallint 6, mediumint 9, int 11, bigint 20). Es ist zu beachten, dass diese Standardlängen ausreichen, um eine beliebige Zahl anzuzeigen kann in diesem Feld gespeichert werden (Beispiel: Der maximale Wert für smallint ist 2 ^ 16 = 65536, 5 Stellen). Wenn Sie keinen guten Grund haben, etwas anderes zu tun, würde ich empfehlen, die Standardgrößen beizubehalten, um böse Überraschungen zu vermeiden.
Thibault Witzig
167

INT ( x ) unterscheidet sich nur in Bezug auf die Anzeige , dh die Zahl wird in x- Ziffern angezeigt und ist nicht auf 11 beschränkt. Sie koppeln es mitZEROFILL, wodurch die Nullen vorangestellt werden, bis sie Ihrer Länge entsprechen.

Also für eine beliebige Anzahl von x inINT(x)

  • Wenn der gespeicherte Wert weniger Ziffern als x hat , ZEROFILLwerden Nullen vorangestellt.

    INT (5) ZEROFILL mit dem gespeicherten Wert von 32 zeigt 00032 an.
    INT (5) mit dem gespeicherten Wert von 32 zeigt 32 an
    INT mit dem gespeicherten Wert von 32 zeigt 32 an

  • Wenn der gespeicherte Wert mehr Ziffern als x hat , wird er so angezeigt, wie er ist.

    INT (3) ZEROFILL mit dem gespeicherten Wert von 250000 zeigt 250000 an.
    INT (3) mit dem gespeicherten Wert von 250000 zeigt 250000 an
    INT mit dem gespeicherten Wert von 250000 zeigt 250000 an

Der in der Datenbank gespeicherte tatsächliche Wert ist nicht betroffen, die Größe bleibt unverändert, und jede Berechnung verhält sich normal.

Dies gilt auch für BIGINT, MEDIUMINT, SMALLINT und TINYINT.

Priyabagus
quelle
49
Die Länge macht also absolut nichts, es sei denn, Sie verwenden Nullfüllung?
Developerbmw
29
@developerbmw - Richtig. Die Länge macht absolut nichts, wenn Sie nicht verwenden ZEROFILL.
Rick James
ZEROFILL ist im Wesentlichen ein Mainframe-Kompatibilitätsmodus.
Henk Poley
114

Nach hier , int(11)wird 4 Byte Platz nehmen , die 32 - Bit - Raum mit ist 2^(31) = 2147483648Maximalwert und -2147483648Minimalwert. Ein Bit ist für Zeichen.

Santosh Linkha
quelle
1
Ihr Beispiel hat 9 Neunen. Können Sie bitte bestätigen, dass Ihr Beispiel korrekt ist? Wenn ja, warum heißt es 10, wenn es 9 Neunen gibt? Ist es die Anzahl der Ziffern plus eins plus das Zeichen?
Homer6
5
Nein, die maximale Anzahl beträgt 4294967295, wenn int ohne Vorzeichen, dh 2 ^ 32. Die Zahl in Klammern hat keinen Einfluss auf den Speichertyp. Wenn Sie mehr als 2 ^ 32 benötigen, müssen Sie zu bigint gehen.
Kieran Tully
7
Oder besser gesagt (2 ^ 32) -1.
Kieran Tully
2
+ Kieran hat recht. Die maximale Anzahl unterscheidet sich von der in der Antwort. Siehe hier
daviewales
38

Wie bereits erwähnt, werden die Mindest- / Maximalwerte, die in der Spalte gespeichert werden können, und der Speicherbedarf in Byte nur durch den Typ und nicht durch die Länge definiert.

Viele dieser Antworten sagen, dass die (11) Teil nur die Anzeigebreite beeinflusst, was nicht genau stimmt, aber meistens.

Eine Definition int(2)mit keinem zerofill angegeben werden:

  • Akzeptiere immer noch einen Wert von 100
  • noch angezeigt einen Wert von , 100wenn der Ausgang (nicht 0oder00 )
  • Die Anzeigebreite ist die Breite des größten Werts, der von der Auswahlabfrage ausgegeben wird.

Das einzige, was der (2)Wille tun wird, ist, wenn auch Nullfüllung angegeben ist :

  • Ein Wert von 1wird angezeigt 01.
  • Bei der Anzeige von Werten hat die Spalte immer eine Breite des maximal möglichen Werts, den die Spalte annehmen kann , nämlich 10 Stellen für eine Ganzzahl anstelle der Mindestbreite, die erforderlich ist, um den größten Wert anzuzeigen, für den die Spalte in dieser bestimmten Auswahlabfrage angezeigt werden muss , die viel kleiner sein könnte.
  • Die Spalte kann weiterhin einen Wert annehmen und anzeigen, der die Länge überschreitet. Diesen Werten wird jedoch kein Nullzeichen vorangestellt.

Der beste Weg, um alle Nuancen zu sehen, ist zu laufen:

CREATE TABLE `mytable` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `int1` int(10) NOT NULL,
    `int2` int(3) NOT NULL,
    `zf1` int(10) ZEROFILL NOT NULL,
    `zf2` int(3) ZEROFILL NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `mytable` 
(`int1`, `int2`, `zf1`, `zf2`) 
VALUES
(10000, 10000, 10000, 10000),
(100, 100, 100, 100);

select * from mytable;

welches ausgegeben wird:

+----+-------+-------+------------+-------+
| id | int1  | int2  | zf1        | zf2   |
+----+-------+-------+------------+-------+
|  1 | 10000 | 10000 | 0000010000 | 10000 |
|  2 |   100 |   100 | 0000000100 |   100 |
+----+-------+-------+------------+-------+

Diese Antwort wurde gegen MySQL 5.7.12 für Linux getestet und kann für andere Implementierungen variieren oder nicht.

Programmierer
quelle
5
"Beachten Sie, dass die Spalte int1 eine viel kleinere Anzeigebreite als zerofill2 hat, obwohl die Länge größer ist" ... Ähm, das liegt nur daran, dass der Spaltenname 'zerofill2' 9 Zeichen lang ist, während 'int1' 4 ist.
neokio
2
... ja, also hat die Länge eindeutig keine Auswirkung, auch nicht auf die Anzeigebreite, wenn die Nullfüllung nicht aktiviert ist. Andernfalls wäre int1 mit einer Breite von 10 Zeichen viel breiter.
Programster
2
Eine gute Erklärung mit einem soliden Beispiel. Viel bessere Antwort als die akzeptierte. Vielen Dank, dass Sie @Programster.
Corin
Minor nit: Wie neokio betont, kann man aus dieser Abfrage die genauen Konsequenzen von "int (3)" mit Nullfüllung nicht beobachten. Kürzen Sie den Spaltennamen auf "zf2", um das Verhalten klarer zu machen. Insbesondere, ob wahr oder falsch [bei gegebener DB-Version], dass "(mit Nullfüllung) Bei der Anzeige von Werten hat die Spalte immer eine Breite des maximal möglichen Werts, den die Spalte annehmen kann, nämlich 10 Stellen für eine Ganzzahl"
ToolmakerSteve
1
Um den Kommentar von neokio und meinen kleinen Kommentar zu verdeutlichen: Der Satz "Beachten Sie, dass die Spalte int1 eine viel kleinere Anzeigebreite als zerofill2 hat, obwohl die Länge größer ist." sollte aus der Antwort entfernt werden. Dies ist eine Folge der Anzahl der Zeichen im Kopfwort "zerofill2" - es hat nichts mit dem Testen der Anzeigebreiten zu tun. Geben Sie dieser Spalte lieber einen kürzeren Namen, z. B. "zf2". Dann hätten wir eine Tabelle, in der "int1, int2 und zf2 alle genau die gleiche Breite haben, obwohl int2 und zf2 eine kleine Breite (3) angeben".
ToolmakerSteve
32

Wie groß ist die Spalte von int (11) in MySQL in Bytes?

(11)- Dieses Attribut vom intDatentyp hat nichts mit der Größe der Spalte zu tun. Es ist nur die Anzeigebreite des ganzzahligen Datentyps. Ab 11.1.4.5. Numerische Typattribute :

MySQL unterstützt eine Erweiterung zum optionalen Angeben der Anzeigebreite von ganzzahligen Datentypen in Klammern nach dem Basisschlüsselwort für den Typ. Beispielsweise gibt INT (4) ein INT mit einer vierstelligen Anzeigebreite an.

ks1322
quelle
19

Eine gute Erklärung hierfür finden Sie hier.

Zusammenfassend: Die Zahl N in int (N) wird häufig durch die maximal zulässige Größe der Spalte verwechselt, wie dies im Fall von varchar (N) der Fall ist.

Dies ist jedoch bei Integer-Datentypen nicht der Fall. aufgefüllt Die Zahl N in Klammern ist nicht die maximale Größe für die Spalte, sondern lediglich ein Parameter, der MySQL in welcher Breite die Spalte angezeigt werden soll, wenn die Daten der Tabelle über MySQL angezeigt werden Konsole (wenn Sie das ZEROFILL-Attribut verwenden).

Die Zahl in Klammern gibt MySQL an, mit wie vielen Nullen eingehende Ganzzahlen aufgefüllt werden sollen. Beispiel: Wenn Sie ZEROFILL für eine Spalte verwenden, die auf INT (5) gesetzt ist und die Zahl 78 eingefügt ist, füllt MySQL diesen Wert mit Nullen auf, bis die Zahl der Zahl in Klammern entspricht. dh 78 wird zu 00078 und 127 wird zu 00127. Um es zusammenzufassen: Die Zahl in Klammern wird für Anzeigezwecke verwendet.
In gewisser Weise ist die Zahl in Klammern nutzlos, es sei denn, Sie verwenden das Attribut ZEROFILL.

Die Größe für das int würde also gleich bleiben, dh -2147483648 bis 2147483648 für signiert und 0 bis 4294967295 für nicht signiert(~ 2,15 Milliarden und 4,2 Milliarden, was einer der Gründe ist, warum Entwickler die Geschichte hinter der Zahl N in Klammern nicht kennen, da sie die Datenbank kaum beeinflusst, es sei denn, sie enthält mehr als 2 Milliarden Zeilen) und in Bytes wäre 4 Bytes .

Weitere Informationen zur Größe / zum Bereich von Integer-Typen finden Sie im MySQL-Handbuch

shashi009
quelle
Warum kommt hier die Anzahl der Zeilen ins Spiel?
Old Geezer
@OldGeezer - stimme zu, "Anzahl der Zeilen" ist für die meisten Spalten irrelevant. Nur relevant für die automatische Inkrementierung der Primärschlüsselspalte (ID).
ToolmakerSteve
10

Obwohl es unwahrscheinlich ist, dass diese Antwort gesehen wird, halte ich die folgende Klarstellung für wert:

  • Das (n) hinter einem ganzzahligen Datentyp in MySQL gibt die Anzeigebreite an
  • Die Anzeigebreite begrenzt NICHT die Länge der von einer Abfrage zurückgegebenen Nummer
  • Die Anzeigebreite begrenzt die Anzahl der für eine mit Nullen gefüllten Spalte gefüllten Nullen, sodass die Gesamtzahl mit der Anzeigebreite übereinstimmt (solange die tatsächliche Anzahl die Anzeigebreite nicht überschreitet. In diesem Fall wird die Anzahl unverändert angezeigt.)
  • Die Anzeigebreite ist auch als nützliches Werkzeug für Entwickler gedacht, um zu wissen, auf welche Länge der Wert aufgefüllt werden soll

Ein bisschen Detail
Die Anzeigebreite soll anscheinend einige Metadaten darüber liefern, wie viele Nullen in einer mit Null gefüllten Zahl angezeigt werden sollen.
Die Länge einer von einer Abfrage zurückgegebenen Nummer wird NICHT begrenzt, wenn diese Nummer die angegebene Anzeigebreite überschreitet.
Um zu wissen, welche Länge / Breite für einen ganzzahligen Datentyp in MySQL tatsächlich zulässig ist , lesen Sie die Liste und den Link: ( Typen: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT );
Nach alledem können Sie davon ausgehen, dass die Anzeigebreite keinen Einfluss auf die Ergebnisse einer Standardabfrage hat, es sei denn, die Spalten sind als ZEROFILL-Spalten angegeben
ODER
für den Fall, dass die Daten in eine Anwendung gezogen werden und diese Anwendung die Daten sammelt Anzeigebreite für andere Polster.

Primärreferenz: https://blogs.oracle.com/jsmyth/entry/what_does_the_11_mean

MER
quelle
Vielen Dank für die richtige Antwort. Ich habe es über die MySQL-Befehlszeile versucht, und ich konnte es nicht dazu bringen, irgendwelche Ziffern mit kleinen nzu entfernen, also ... ja, das ist Bullcrap. Es macht nur etwas mit Nullfüllung.
Mpen
@mpen froh, dass ich helfen konnte, dies hing mit etwas zusammen, das ich versuchte, und dachte, ich könnte hier mehr Details darüber einfügen, die für jemand anderen nützlich sein könnten.
MER
9

In MySQL hat die Ganzzahl int(11)eine Größe von 4 Bytes, was 32 Bit entspricht.

Der vorzeichenbehaftete Wert ist: - 2^(32-1) to 0 to 2^(32-1)-1 = -2147483648 to 0 to 2147483647

Vorzeichenlose Werte sind: 0 to 2^32-1 = 0 to 4294967295

Sachin Agrawal
quelle
0

nach diesem Buch :

Mit MySQL können Sie eine "Breite" für ganzzahlige Typen wie INT (11) angeben. Dies ist für die meisten Anwendungen bedeutungslos: Es schränkt den zulässigen Wertebereich nicht ein, sondern gibt lediglich die Anzahl der Zeichen an, die die interaktiven Tools von MySQL für Anzeigezwecke reservieren. Für Speicher- und Berechnungszwecke ist INT (1) identisch mit INT (20).

Alireza Rahmani Khalili
quelle
-4

Ich denke, der maximale Wert von int (11) ist 4294967295

Samuel
quelle
2
Es ist 2147483647, weil es Zeichen hat.
d3bit
-9

4294967295 ist die Antwort, da int (11) maximal 11 Stellen IMO anzeigt

Alter, Alter
quelle