¿Cuál es la diferencia entre tinyint, smallint, mediumint, bigint e int en MySQL?

368

¿Cuál es la diferencia entre tinyint, smallint, mediumint, bigint e int en MySQL?

¿En qué casos se deben usar?

Sein Kraft
fuente

Respuestas:

575

Ocupan diferentes cantidades de espacio y tienen diferentes rangos de valores aceptables.

Estos son los tamaños y rangos de valores para SQL Server , otros RDBMS tienen documentación similar:

Resulta que todos usan la misma especificación (con algunas excepciones menores que se mencionan a continuación) pero admiten varias combinaciones de esos tipos (Oracle no está incluido porque solo tiene un NUMBERtipo de datos, consulte el enlace anterior):

             | 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

Y admiten los mismos rangos de valores (con una excepción a continuación) y todos tienen los mismos requisitos de almacenamiento:

            | 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 

Los tipos "sin firmar" solo están disponibles en MySQL, y el resto solo usa los rangos firmados, con una excepción notable: tinyinten SQL Server no está firmado y tiene un rango de valores de 0 a 255

Daniel DiPaolo
fuente
21
No sabía que los tipos sin firmar están disponibles solo en MySQL, esta es una gran ventaja de MySQL sobre otros RDBMS. ¿Ha cambiado algo desde el día en que se publicó esta respuesta?
biox
3
@Daniel, ¿Qué están pensando? ¿Por qué hay uno para 3 bytes pero ninguno para 6 bytes?
Pacerier
10
@Pacerier probablemente no sabían cómo nombrarlo :))
Mihai Matei
55
Deberían haber llamado a eso bigint y, en lugar de bigint, humongousint.
MarioDS
55
greatint podría ser una opción, siendo Oracle una empresa estadounidense. :)
osiris
32

el tamaño de almacenamiento requerido y qué tan grandes pueden ser los números

en 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)

puede almacenar el número 1 en los 4, pero un bigint usará 8 bytes mientras que un tinyint usará 1 byte

SQLMenace
fuente
15

Esos parecen ser tipos de datos MySQL.

Según la documentación que llevan:

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

Y, naturalmente, acepte rangos de números cada vez más grandes.

ANeves
fuente
9

Cuando se trata del uso en el mundo real de estos tipos de datos, es muy importante que comprenda que usar ciertos tipos de enteros podría ser una exageración o un uso insuficiente. Por ejemplo, el uso de un tipo de datos entero para employeeCount en una tabla indica que el empleado podría ser una exageración ya que admite un rango de valores enteros desde ~ 2 mil millones negativos a 2 mil millones positivos o cero a aproximadamente 4 mil millones (sin signo). Por lo tanto, incluso si considera que uno de los empleadores más grandes de los EE. UU., Como Walmart, con aproximadamente 2.2 millones de empleados que usan un tipo de datos entero para la columna employeeCount sería innecesario. En tal caso, utiliza mediumint (que admite de 0 a 16 millones (sin signo)), por ejemplo. Dicho esto, si se espera que su rango sea inusualmente grande, podría considerar bigint, que como puede ver en Daniel '

Anil M
fuente
2
En su ejemplo de WalMart con 2.2 millones de empleados activos, creo que con una rotación de personal de aproximadamente el 50% anual, un tipo INT en EmployeeID sería el mínimo necesario. ¿Qué piensan ustedes? De acuerdo, para la mayoría de las compañías normales, un tipo INT sería ¡MUY exagerado!
kiltannen
3

La diferencia es la cantidad de memoria asignada a cada número entero y la cantidad que pueden almacenar cada uno.

Alexsander Akers
fuente
2

Tipo de datos Rango Almacenamiento

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

Ejemplo

El siguiente ejemplo crea una tabla utilizando los tipos de datos bigint, int, smallint y tinyint. Los valores se insertan en cada columna y se devuelven en la instrucción 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;
Vikram Rathaur
fuente