418 Stimmen

Was ist der Unterschied zwischen tinyint, smallint, mediumint, bigint und int in MySQL?

Was ist der Unterschied zwischen tinyint, smallint, mediumint, bigint und int in MySQL?

In welchen Fällen sollten diese verwendet werden?

642voto

Daniel DiPaolo Punkte 53359

Sie nehmen unterschiedliche Mengen an Platz ein und haben unterschiedliche akzeptable Wertebereiche.

Hier sind die Größen und Wertebereiche für SQL Server, andere RDBMS haben ähnliche Dokumentation:

Es stellt sich heraus, dass sie alle dieselbe Spezifikation verwenden (mit einigen geringfügigen Ausnahmen, die unten angegeben sind), aber unterschiedliche Kombinationen dieser Typen unterstützen (Oracle nicht inbegriffen, da es nur einen NUMBER Datentyp hat, siehe obigen Link):

             | SQL Server    MySQL   Postgres    DB2
---------------------------------------------------
tinyint      |     X           X                
smallint     |     X           X         X        X
mediumint    |                 X
int/integer  |     X           X         X        X 
bigint       |     X           X         X        X

Und sie unterstützen die gleichen Wertebereiche (mit einer Ausnahme unten) und haben alle dieselben Speicheranforderungen:

            | Bytes    Bereich (signed)                               Bereich (unsigned)
--------------------------------------------------------------------------------------------
tinyint     | 1 Byte   -128 bis 127                                  0 bis 255
smallint    | 2 Bytes  -32768 bis 32767                              0 bis 65535
mediumint   | 3 Bytes  -8388608 bis 8388607                          0 bis 16777215
int/integer | 4 Bytes  -2147483648 bis 2147483647                    0 bis 4294967295
bigint      | 8 Bytes  -9223372036854775808 bis 9223372036854775807  0 bis 18446744073709551615 

Die "unsigned" Typen sind nur in MySQL verfügbar, die anderen verwenden einfach die signed Wertebereiche, mit einer bemerkenswerten Ausnahme: tinyint in SQL Server ist unsigned und hat einen Wertebereich von 0 bis 255

26 Stimmen

Ich wusste nicht, dass nicht signierte Typen nur in MySQL verfügbar sind, das ist ein großer Vorteil von MySQL gegenüber anderen RDBMS. Hat sich seit dem Tag, an dem diese Antwort gepostet wurde, etwas geändert?

4 Stimmen

@Daniel, Was denken sie, warum gibt es eine für 3 byte aber keine für 6 bytes?

11 Stimmen

@Pacerier Wahrscheinlich wussten sie nicht, wie sie es benennen sollten :))

42voto

SQLMenace Punkte 128184

Der Speicherbedarf und wie groß die Zahlen sein können.

Auf SQL Server:

  • tinyint 1 Byte, 0 bis 255
  • smallint 2 Bytes, -215 (-32.768) bis 215 -1 (32.767)
  • int 4 Bytes, -231 (-2.147.483.648) bis 231 -1 (2.147.483.647)
  • bigint 8 Bytes, -263 (-9.223.372.036.854.775.808) bis 263 -1 (9.223.372.036.854.775.807)

Du kannst die Zahl 1 in alle 4 speichern, aber ein bigint wird 8 Bytes verwenden, während ein tinyint nur 1 Byte verwenden wird.

21voto

ANeves Punkte 5941

Dies scheinen MySQL-Datentypen zu sein.

Laut der Dokumentation nehmen sie folgendes an:

  1. tinyint = 1 Byte
  2. smallint = 2 Bytes
  3. mediumint = 3 Bytes
  4. int = 4 Bytes
  5. bigint = 8 Bytes

Und sie akzeptieren natürlich immer größer werdende Zahlenbereiche.

12voto

Anil M Punkte 149

Wenn es um den realen Einsatz dieser Datentypen geht, ist es sehr wichtig zu verstehen, dass die Verwendung bestimmter ganzzahliger Typen entweder überdimensioniert oder unterdimensioniert sein könnte. Wenn Sie zum Beispiel den Integer-Typ für die Mitarbeiteranzahl in einer Tabelle wie "employee" verwenden, wäre dies überdimensioniert, da er einen Bereich ganzzahliger Werte von ca. negativen 2 Milliarden bis positiven 2 Milliarden oder null bis etwa 4 Milliarden (unsigned) unterstützt. Selbst wenn Sie einen der größten US-Arbeitgeber wie Walmart mit rund 2,2 Millionen Mitarbeitern betrachten, wäre die Verwendung eines Integer-Datentyps für die Spalte "employeeCount" unnötig. In einem solchen Fall verwenden Sie beispielsweise mediumint (das von 0 bis 16 Millionen (unsigned) unterstützt). Abgesehen davon, wenn Ihr Bereich ungewöhnlich groß ist, könnten Sie bigint in Betracht ziehen, der, wie Sie anhand von Daniels Notizen sehen können, einen größeren Bereich unterstützt, als ich mich bemühe zu entschlüsseln.

6 Stimmen

In Ihrem Beispiel von WalMart mit 2,2 Mio. aktiven Mitarbeitern - Ich denke, dass bei einem jährlichen Mitarbeiterverschleiß von etwa 50% ein INT-Typ für EmployeeID das Mindeste wäre. Was denken Sie alle? Zugegeben - für die MEISTEN normalen Unternehmen wäre ein INT-Typ VIEL zu überdimensioniert!

2voto

Alexsander Akers Punkte 15879

Der Unterschied liegt in der Menge des Speichers, der jedem Integer zugewiesen wird, und wie groß eine Zahl ist, die sie speichern können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X