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

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

W jakich przypadkach należy je stosować?

 312
Author: think123, 2010-06-07

6 answers

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

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

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

I obsługują te same zakresy wartości (z jednym wyjątkiem poniżej) i wszystkie mają te same wymagania dotyczące przechowywania:

  • tinyint: 1 bajt, -128 do + 127 / 0 do 255 (unsigned)
  • smallint: 2 bajty, -32,768 do + 32,767 / 0 do 65,535 (unsigned)
  • mediumint: 3 bajtów, -8,388,608 do 8,388,607 / 0 do 16,777,215 (unsigned)
  • int/integer: 4 bajty, -2,147,483,648 do +2,147,483,647 / 0 do 4,294,967,295 (unsigned)
  • bigint: 8 bajty, -9,223,372,036,854,775,808 do 9,223,372,036,854,775,807 / 0 do 18,446,744,073,709,551,615 (unsigned)

Typy "niepodpisane" są dostępne tylko w MySQL, a pozostałe używają tylko podpisanych zakresów, z jednym znaczącym wyjątkiem: tinyint w SQL Server jest niepodpisany i ma zakres wartości od 0 do 255

 502
Author: Daniel DiPaolo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-08 15:11:01

Wielkość wymaganego magazynu i jak duże mogą być liczby

On SQL Server

Tinyint 1 bajt, 0 do 255

Smallint 2 bajty, -2^15 (-32,768) do 2^15-1 (32,767)

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 tinyint użyje 1 bajtu

 27
Author: SQLMenace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-07 19:30:24

To chyba typy danych MySQL.

Zgodnie z dokumentacją przyjmują:

  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.

 11
Author: ANeves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-07 16:51:01

Kiedy dojdzie do rzeczywistego użycia tych typów danych, bardzo ważne jest, abyś zrozumiał, że używanie pewnych typów całkowitych może być po prostu przesadą lub poniżej. Na przykład, użycie integer datatype dla employeeCount w tabeli say employee 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 (niepodpisanych). Tak więc, nawet jeśli wziąć pod uwagę jeden z największych pracodawców w USA, takich jak Walmart z mniej więcej około 2,2 miliona pracowników używających typu danych integer dla kolumny employeeCount byłoby niepotrzebne. W takim przypadku używasz mediumint (który obsługuje od 0 do 16 milionów (unsigned)) na przykład. Powiedziawszy, że jeśli oczekuje się, że twój zakres będzie niezwykle duży, możesz rozważyć bigint, który, jak widać z notatek Daniela, obsługuje zakres większy, niż zależy mi na rozszyfrowaniu.

 8
Author: Anil M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-28 16:23:17

Różnica polega na ilości pamięci przydzielonej do każdej liczby całkowitej oraz na tym, jak duża liczba może być przechowywana.

 3
Author: Alexsander Akers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-07 16:45:55

Data type Range Storage

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;
 2
Author: Vikram Rathaur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-06 05:45:56