Jaka jest różnica między tinyint, smallint, mediumint, bigint i int w MySQL?


368

Jaka jest różnica między tinyint, smallint, mediumint, bigint i int w MySQL?

W jakich przypadkach należy je zastosować?

Odpowiedzi:


574

Zajmują różne ilości miejsca i mają różne zakresy dopuszczalnych wartości.

Oto rozmiary i zakresy wartości dla SQL Server , inne RDBMS mają podobną dokumentację:

Okazuje się, że wszystkie używają tej samej specyfikacji (z kilkoma drobnymi wyjątkami wymienionymi poniżej), ale obsługują różne kombinacje tych typów (Oracle nie jest dołączony, ponieważ ma tylko NUMBERtyp danych, patrz powyższy 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

Obsługują te same zakresy wartości (z jednym wyjątkiem poniżej) i wszystkie mają takie same wymagania dotyczące pamięci:

            | 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 

Typy „niepodpisane” są dostępne tylko w MySQL, a reszta korzysta tylko z podpisanych zakresów, z jednym godnym uwagi wyjątkiem: tinyintw SQL Server jest niepodpisany i ma zakres wartości od 0 do 255


21
Nie wiedziałem, że typy bez znaku są dostępne tylko w MySQL, jest to ogromna przewaga MySQL nad innymi RDBMS. Coś się zmieniło od dnia opublikowania tej odpowiedzi?
biox,

3
@Daniel, Co oni myślą, dlaczego istnieje jeden na 3 bajty, ale żaden na 6 bajtów?
Pacerier

9
@Pacerier prawdopodobnie nie wiedzieli, jak to nazwać :))
Mihai Matei

5
Powinni oni nazywane że bigint i zamiast bigint, A humongousint.
MarioDS

5
Greatint może być opcją, ponieważ Oracle jest amerykańską firmą. :)
osiris

32

wymagany rozmiar pamięci i jak duże mogą być liczby

na SQL Server

tinyint 1 bajt, od 0 do 255

smallint 2 bajty, -2 ^ 15 (-32768) do 2 ^ 15-1 (32767)

int 4 bajty, -2 ^ 31 (-2 147 483 648) do 2 ^ 31-1 (2 147 483 647)

bigint 8 bajtów, -2 ^ 63 (-9,223,372,036,854,775,808) do 2 ^ 63-1 (9,223,372,036,854,775,807)

możesz zapisać liczbę 1 we wszystkich 4, ale bigint będzie używał 8 bajtów, podczas gdy maleint będzie używał 1 bajtu


15

Są to typy danych MySQL.

Zgodnie z dokumentacją biorą:

  1. tinyint = 1 bajt
  2. smallint = 2 bajty
  3. mediumint = 3 bajty
  4. int = 4 bajty
  5. bigint = 8 bajtów

I oczywiście akceptuj coraz większe zakresy liczb.


9

Kiedy dochodzi do rzeczywistego wykorzystania tych typów danych, bardzo ważne jest, aby zrozumieć, że używanie niektórych typów liczb całkowitych może być po prostu nadmiernym wykorzystaniem lub zbyt niskim wykorzystaniem. Na przykład przy użyciu typu danych liczb całkowitych dla pracownikaCount w tabeli powiedzmy, że pracownik może być przesadą, ponieważ obsługuje zakres wartości całkowitych od ~ ujemnych 2 miliardów do dodatnich 2 miliardów lub od zera do około 4 miliardów (bez znaku). Tak więc, nawet jeśli weźmiesz pod uwagę jednego z największych pracodawców w USA, takiego jak Walmart, który zatrudnia około 2,2 miliona pracowników korzystających z typu danych liczb całkowitych dla kolumny pracownika, byłoby niepotrzebne. W takim przypadku używasz na przykład mediumint (który obsługuje od 0 do 16 milionów (niepodpisany)). Powiedziawszy, że jeśli spodziewamy się, że twój zasięg będzie wyjątkowo duży, możesz rozważyć bigint, który, jak widać z Daniela


2
W twoim przykładzie WalMart z 2,2 mln aktywnych pracowników - pomyślałbym, że przy rotacji pracowników wynoszącej około 50% rocznie, typ INT na EmployeeID byłby niezbędnym minimum. Co myślisz To prawda - dla WIĘKSZOŚCI normalnych firm, typ INT byłby DROGĄ przesadą!
kiltannen

3

Różnica polega na ilości pamięci przydzielonej do każdej liczby całkowitej oraz na to, jak duża liczba może każda z nich przechowywać.


2

Typ danych Zakres Przechowywanie

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

Przykład

Poniższy przykład tworzy tabelę przy użyciu typów danych bigint, int, smallint i tinyint. Wartości są wstawiane do każdej kolumny i zwracane w instrukcji SELECT.

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;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.