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

368

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

In welchen Fällen sollten diese verwendet werden?

Sein Kraft
quelle

Antworten:

575

Sie nehmen unterschiedlich viel Platz ein und haben unterschiedliche Bereiche akzeptabler Werte.

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

Es stellt sich heraus, dass alle dieselbe Spezifikation verwenden (mit einigen kleinen Ausnahmen, die unten angegeben sind), aber verschiedene Kombinationen dieser Typen unterstützen (Oracle nicht enthalten, da es nur einen NUMBERDatentyp 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 dieselben Wertebereiche (mit einer Ausnahme unten) und haben alle dieselben Speicheranforderungen:

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

Die "vorzeichenlosen" Typen sind nur in MySQL verfügbar, und der Rest verwendet nur die vorzeichenbehafteten Bereiche, mit einer bemerkenswerten Ausnahme: tinyintIn SQL Server ist vorzeichenlos und hat einen Wertebereich von 0 bis 255

Daniel DiPaolo
quelle
21
Ich wusste nicht, dass vorzeichenlose Typen nur in MySQL verfügbar sind. Dies ist ein großer Vorteil von MySQL gegenüber anderen RDBMS. Hat sich seit dem Tag, an dem diese Antwort veröffentlicht wurde, etwas geändert?
Biox
3
@ Daniel, was denken sie, warum gibt es eine für 3 Bytes, aber keine für 6 Bytes?
Pacerier
10
@ Pacerier wahrscheinlich wussten sie nicht, wie man es benennt :))
Mihai Matei
5
Sie hätten das einen Bigint und anstelle von Bigint einen Humongousint nennen sollen.
MarioDS
5
Greatint könnte eine Option sein, da Oracle ein US-amerikanisches Unternehmen ist. :)
Osiris
32

die Größe des benötigten Speichers und wie groß die Anzahl sein kann

auf SQL Server

tinyint 1 Byte, 0 bis 255

smallint 2 Bytes, -2 ^ 15 (-32.768) bis 2 ^ 15-1 (32.767)

int 4 Bytes, -2 ^ 31 (-2,147,483,648) bis 2 ^ 31-1 (2,147,483,647)

Bigint 8 Bytes, -2 ^ 63 (-9,223,372,036,854,775,808) bis 2 ^ 63-1 (9,223,372,036,854,775,807)

Sie können die Nummer 1 in allen 4 speichern, aber ein Bigint verwendet 8 Bytes, während ein Winzling 1 Byte verwendet

SQLMenace
quelle
15

Dies scheinen MySQL-Datentypen zu sein.

Laut der Dokumentation nehmen sie:

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

Und akzeptieren Sie natürlich immer größere Zahlenbereiche.

ANeves
quelle
9

Wenn es um die reale Verwendung dieser Datentypen geht, ist es sehr wichtig, dass Sie verstehen, dass die Verwendung bestimmter ganzzahliger Typen nur ein Overkill oder eine Unteranwendung sein kann. Wenn Sie beispielsweise den Integer-Datentyp für employeeCount in einer Tabelle verwenden, könnte der Mitarbeiter ein Overkill sein, da er einen Bereich von Integer-Werten von ~ minus 2 Milliarden bis positiv 2 Milliarden oder null bis ungefähr 4 Milliarden (ohne Vorzeichen) unterstützt. Selbst wenn Sie einen der größten Arbeitgeber der USA wie Walmart mit etwa 2,2 Millionen Mitarbeitern in Betracht ziehen, wäre die Verwendung eines ganzzahligen Datentyps für die Spalte employeeCount unnötig. In einem solchen Fall verwenden Sie beispielsweise mediumint (das 0 bis 16 Millionen (ohne Vorzeichen) unterstützt). Wenn jedoch erwartet wird, dass Ihre Reichweite ungewöhnlich groß ist, können Sie Bigint in Betracht ziehen, wie Sie an Daniel sehen können.

Anil M.
quelle
2
In Ihrem Beispiel für WalMart mit 2,2 Millionen aktiven Mitarbeitern würde ich denken, dass bei einer Fluktuation von ca. 50% pro Jahr ein INT-Typ für EmployeeID das erforderliche Minimum wäre. Was denkst du? Zugegeben - für die meisten normalen Unternehmen wäre ein INT-Typ viel übertrieben!
Kiltannen
3

Der Unterschied besteht in der Größe des Speichers, der jeder Ganzzahl zugewiesen ist, und in der Größe, die jede Zahl speichern kann.

Alexsander Akers
quelle
2

Datentyp Bereichsspeicherung

bigint  -2^63 (-9,223,372,036,854,775,808) to 2^63-1 (9,223,372,036,854,775,807)    8 Bytes
int -2^31 (-2,147,483,648) to 2^31-1 (2,147,483,647)    4 Bytes
smallint    -2^15 (-32,768) to 2^15-1 (32,767)  2 Bytes
tinyint 0 to 255    1 Byte

Beispiel

Im folgenden Beispiel wird eine Tabelle mit den Datentypen bigint, int, smallint und tinyint erstellt. Werte werden in jede Spalte eingefügt und in der SELECT-Anweisung zurückgegeben.

CREATE TABLE dbo.MyTable
(
  MyBigIntColumn bigint
 ,MyIntColumn  int
 ,MySmallIntColumn smallint
 ,MyTinyIntColumn tinyint
);

GO

INSERT INTO dbo.MyTable VALUES (9223372036854775807, 214483647,32767,255);
 GO
SELECT MyBigIntColumn, MyIntColumn, MySmallIntColumn, MyTinyIntColumn
FROM dbo.MyTable;
Vikram Rathaur
quelle