В чем разница между tinyint, smallint, mediumint, bigint и int в MySQL?
В каких случаях они должны использоваться?
В чем разница между tinyint, smallint, mediumint, bigint и int в MySQL?
В каких случаях они должны использоваться?
Они занимают разные объемы пространства и имеют разные диапазоны допустимых значений.
Вот размеры и диапазоны значений для 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
размер требуемой памяти и насколько велики числа
на 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 байт
Похоже, что это типы данных MySQL.
В соответствии с документацией они берут:
И, естественно, принимать все более широкие диапазоны чисел.
Когда дело доходит до использования этими типами данных в реальном мире, очень важно, чтобы вы понимали, что использование определенных целых типов может быть просто избыточным или используемым. Например, используя целочисленный тип данных для employeeCount в таблице, скажем, сотрудник может быть чрезмерным, поскольку он поддерживает диапазон целочисленных значений от ~ минус 2 миллиарда до положительного 2 миллиарда или от нуля до примерно 4 миллиардов (без знака). Таким образом, даже если вы считаете, что один из крупнейших работодателей США, таких как Walmart, с примерно 2,2 миллиона сотрудников, использующих целочисленный тип данных для столбца employeeCount, не нужен. В таком случае вы используете mediumint (который поддерживает от 0 до 16 миллионов (без знака)), например. Сказав, что если ваш диапазон ожидается необычно большим, вы можете рассмотреть bigint, который, как вы можете видеть из заметок Дэниела, поддерживает диапазон, который больше, чем я хотел бы расшифровать.
Разница заключается в количестве памяти, выделенной для каждого целого числа, и о том, сколько из них может хранить каждый.
Тип данных Диапазон хранения
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;