В чем разница между tinyint, smallint, mediumint, bigint и int в MySQL?

368

В чем разница между tinyint, smallint, mediumint, bigint и int в MySQL?

В каких случаях их следует использовать?

Сейн Крафт
источник

Ответы:

575

Они занимают различное количество места и имеют разные диапазоны допустимых значений.

Вот размеры и диапазоны значений для SQL Server , другие РСУБД имеют аналогичную документацию:

Оказывается, все они используют одну и ту же спецификацию (с некоторыми незначительными исключениями, отмеченными ниже), но поддерживают различные комбинации этих типов (Oracle не включен, потому что он имеет только NUMBERтип данных, см. Ссылку выше):

             | 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

И они поддерживают одинаковые диапазоны значений (с одним исключением ниже) и имеют одинаковые требования к хранилищу:

            | 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 

Типы «unsigned» доступны только в MySQL, а остальные используют только подписанные диапазоны, за одним заметным исключением: tinyintв SQL Server неподписан и имеет диапазон значений от 0 до 255

Даниэль ДиПаоло
источник
21
Я не знал, что неподписанные типы доступны только в MySQL, это огромное преимущество MySQL перед другими СУБД. Что-нибудь изменилось со дня публикации этого ответа?
Biox
3
@Daniel, что они думают, почему один на 3 байта, а один на 6 байтов?
Pacerier
10
@Pacerier, вероятно, они не знали, как назвать это :))
Михай Матей
5
Они должны были назвать , что BIGINT и вместо BIGINT, humongousint.
MarioDS
5
greatint мог бы быть вариантом, будучи Oracle компанией США. :)
osiris
32

размер требуемого хранилища и насколько большими могут быть числа

на SQL Server

tinyint 1 байт, от 0 до 255

smallint 2 байта, от -2 ^ 15 (-32,768) до 2 ^ 15-1 (32,767)

int 4 байта, от -2 ^ 31 (-2 147 483 648) до 2 ^ 31-1 (2 147 483 647)

bigint 8 байтов, от -2 ^ 63 (-9,223,372,036,854,775,808) до 2 ^ 63-1 (9,223,372,036,854,775,807)

Вы можете хранить число 1 во всех 4, но bigint будет использовать 8 байтов, а tinyint будет использовать 1 байт

SQLMenace
источник
15

Похоже, что это типы данных MySQL.

Согласно документации они принимают:

  1. tinyint = 1 байт
  2. smallint = 2 байта
  3. mediumint = 3 байта
  4. int = 4 байта
  5. bigint = 8 байт

И, естественно, принимать все более широкие диапазоны чисел.

ANeves
источник
9

Когда дело доходит до реального использования этих типов данных, очень важно, чтобы вы понимали, что использование определенных целочисленных типов может быть просто излишним или недостаточно используемым. Например, используя целочисленный тип данных для employeeCount в таблице, можно сказать, что сотрудник может быть излишним, поскольку он поддерживает диапазон целочисленных значений от ~ 2 миллиардов до 2 миллиардов или от 0 до 4 миллиардов (без знака). Таким образом, даже если вы считаете, что один из крупнейших работодателей в США, например, Walmart с примерно 2,2 млн. Сотрудников, использовать целочисленный тип данных для столбца employeeCount не понадобится. В таком случае вы используете, например, mediumint (который поддерживает от 0 до 16 миллионов (без знака)). Сказав, что если ожидается, что ваш диапазон будет необычно большим, вы можете рассмотреть bigint, который, как вы можете видеть из Даниэля

Анил М
источник
2
В вашем примере WalMart с 2,2 млн. Активных сотрудников - я думаю, что при текучести кадров примерно на 50% в год тип INT для EmployeeID будет минимально необходимым. Что вы все думаете? Конечно, для большинства обычных компаний тип INT будет СЛИШКОМ излишним!
килтаннен
3

Разница заключается в объеме памяти, выделенной для каждого целого числа, и в том, насколько большим может быть каждое из них.

Александр Акерс
источник
2

Тип данных Диапазон Хранение

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

пример

В следующем примере создается таблица с использованием типов данных bigint, int, smallint и tinyint. Значения вставляются в каждый столбец и возвращаются в операторе 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;
Викрам Ратхаур
источник