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

285

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

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

Теги:
integer

6 ответов

467
Лучший ответ

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

Вот размеры и диапазоны значений для 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

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

  • tinyint: 1 байт, от -128 до +127/от 0 до 255 (без знака)
  • smallint: 2 байта, -32,768 до +32,767/0 до 65,535 (без знака)
  • mediumint: 3 байта, -8,388,608 до 8,388,607/0 до 16,777,215 (без знака)
  • int/integer: 4 байта, -2,147,483,648 до +2,147,483,647/0 до 4,294,967,295 (без знака)
  • bigint: 8 байт, -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807/0 до 18,446,744,073,709,551,615 (без знака)

"Беззнаковые" типы доступны только в MySQL, а остальные просто используют подписанные диапазоны с одним заметным исключением: tinyint в SQL Server без знака и имеет диапазон значений 0 до 255

  • 19
    Я не знал, что неподписанные типы доступны только в MySQL, это огромное преимущество MySQL перед другими СУБД. Что-нибудь изменилось со дня публикации этого ответа?
  • 3
    @Daniel, о чем они думают, почему один на 3 байта, а один на 6 байтов?
Показать ещё 6 комментариев
22

размер требуемой памяти и насколько велики числа

на 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 байт

10

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

В соответствии с документацией они берут:

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

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

8

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

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

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

1

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

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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню