Was ist der Unterschied zwischen tinyint, smallint, mediumint, bigint und int in MySQL?
In welchen Fällen sollten diese verwendet werden?
Was ist der Unterschied zwischen tinyint, smallint, mediumint, bigint und int in MySQL?
In welchen Fällen sollten diese verwendet werden?
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
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?
Der Speicherbedarf und wie groß die Zahlen sein können.
Auf SQL Server:
tinyint
1 Byte, 0 bis 255smallint
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.
Dies scheinen MySQL-Datentypen zu sein.
Laut der Dokumentation nehmen sie folgendes an:
tinyint
= 1 Bytesmallint
= 2 Bytesmediumint
= 3 Bytesint
= 4 Bytesbigint
= 8 BytesUnd sie akzeptieren natürlich immer größer werdende Zahlenbereiche.
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.
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!
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.