Qual é a diferença entre tinyint, smallint, mediumint, bigint e int no MySQL?


368

Qual é a diferença entre tinyint, smallint, mediumint, bigint e int no MySQL?

Em que casos eles devem ser usados?

Respostas:


575

Eles ocupam diferentes quantidades de espaço e têm diferentes faixas de valores aceitáveis.

Aqui estão os tamanhos e intervalos de valores para o SQL Server , outros RDBMSes possuem documentação semelhante:

Acontece que todos eles usam a mesma especificação (com algumas pequenas exceções mencionadas abaixo), mas suportam várias combinações desses tipos (Oracle não incluído porque possui apenas um NUMBERtipo de dados, consulte o link acima):

             | 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

E eles oferecem suporte aos mesmos intervalos de valores (com uma exceção abaixo) e todos têm os mesmos requisitos de armazenamento:

            | 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 

Os tipos "não assinados" estão disponíveis apenas no MySQL, e o restante apenas usa os intervalos assinados, com uma exceção notável: tinyintno SQL Server não está assinado e possui um intervalo de valores de 0 a 255


21
Eu não sabia que tipos não assinados estão disponíveis apenas no MySQL, essa é uma grande vantagem do MySQL sobre outros RDBMS. Alguma coisa mudou desde o dia em que esta resposta foi postada?
Biox

3
@ Daniel, o que eles estão pensando, por que existe um para 3 bytes, mas nenhum para 6 bytes?
Pacerier

10
@Pacerier provavelmente não sabia como nomeá-lo :))
Mihai Matei

5
Eles deveriam ter chamado isso de bigint e, em vez de bigint, de humongousint.
MarioDS 30/08/16

5
greatint poderia ser uma opção, sendo a Oracle uma empresa dos EUA. :)
Osíris

32

o tamanho do armazenamento necessário e qual o tamanho dos números

no SQL Server

tinyint 1 byte, 0 a 255

smallint 2 bytes, -2 ^ 15 (-32.768) a 2 ^ 15-1 (32.767)

int 4 bytes, -2 ^ 31 (-2.147.483.648) a 2 ^ 31-1 (2.147.483.647)

bigint 8 bytes, -2 ^ 63 (-9.223.372.036.854.775.808) a 2 ^ 63-1 (9.223.372.036.854.775.807)

você pode armazenar o número 1 em todos os 4, mas um bigint usará 8 bytes enquanto um tinyint usará 1 byte


15

Esses parecem ser tipos de dados MySQL.

De acordo com a documentação que eles usam:

  1. tinyint = 1 byte
  2. smallint = 2 bytes
  3. mediumint = 3 bytes
  4. int = 4 bytes
  5. bigint = 8 bytes

E, naturalmente, aceite intervalos cada vez maiores de números.


9

Quando se trata do uso no mundo real desses tipos de dados, é muito importante que você entenda que o uso de certos tipos inteiros pode ser apenas um exagero ou subutilização. Por exemplo, usando o tipo de dados inteiro para employeeCount em uma tabela, o funcionário pode ser um exagero, pois suporta um intervalo de valores inteiros de ~ 2 bilhões negativos a 2 bilhões positivos ou 2 bilhões positivos ou de zero a aproximadamente 4 bilhões (não assinado). Portanto, mesmo se você considerar um dos maiores empregadores dos EUA, como o Walmart, com cerca de 2,2 milhões de funcionários, usando um tipo de dados inteiro para a coluna employeeCount, seria desnecessário. Nesse caso, você usa mediumint (que suporta de 0 a 16 milhões (não assinado)) por exemplo. Dito isto, se se espera que seu alcance seja incomumente grande, você pode considerar bigint que, como pode ver em Daniel '


2
No seu exemplo do WalMart com 2,2 milhões de funcionários ativos - eu pensaria que, com uma rotatividade de aproximadamente 50% ao ano, um tipo INT no Código do Empregado seria o mínimo necessário. O que vocês acham? Concedido - para a maioria das empresas normais, um tipo INT seria um exagero!
kiltannen

3

A diferença é a quantidade de memória alocada para cada número inteiro e qual o número que cada um pode armazenar.


2

Tipo de dados Intervalo de Armazenamento

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

Exemplo

O exemplo a seguir cria uma tabela usando os tipos de dados bigint, int, smallint e tinyint. Os valores são inseridos em cada coluna e retornados na instrução 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;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.