Tipo de datos numérico

Los datos numéricos se dividen en exactos y aproximados, y en enteros y reales. En una categoría aparte se pueden incluir los valores de bits.

Números enteros exactos

TipoMemoriaRango
TINYINT1 bytede -128 a 127 (de -27 a 27-1)
de 0 a 255 (de 0 a 28-1)
SMALLINT2 bytesde -32.768 a 32.767 (de -215 a 215-1)
de 0 a 65.535 (de 0 a 216-1)
MEDIUMINT3 bytesde -223 a 223-1
de 0 a 224-1
INT
INTEGER
(sinónimos)
4 bytesde -231 a 231-1
de 0 a 232-1
BIGINT8 bytesde -263 a 263-1
de 0 a 264-1

Los números enteros se pueden declarar con la palabra clave UNSIGNED. En ese caso, a los elementos de esa columna no se les pueden asignar valores negativos, y el rango positivo que admite el tipo se duplica. Así, el tipo TINYINT admite valores de -128 a 127, mientras que TINYINT UNSIGNED admite de 0 a 255.

Números reales exactos

TipoRango
DEC[(M,D)]
DECIMAL[(M,D)]
(sinónimos)
Depende de los parámetros M y D

El tipo DECIMAL guarda el valor real exacto. Se usa cuando la precisión es crítica, por ejemplo, al guardar datos financieros.

Ejemplo de uso:

MySQL 8.4
CREATE TABLE Users (
    ...
    salary DECIMAL(5,2)
);

En este ejemplo se declara que en la columna salary se guardarán números de 5 cifras como máximo, 2 de las cuales corresponden a la parte decimal. Es decir, esta columna admitirá valores entre -999,99 y 999,99.

La sintaxis DECIMAL equivale a DECIMAL(M) y DECIMAL(M,0). Por defecto, el parámetro M vale 10.

La parte entera y la parte decimal se guardan como 2 números enteros independientes. A partir de esto, es fácil calcular la memoria que ocupa. Así, en DECIMAL(5,2) la parte entera tiene 3 cifras y ocupa 2 bytes, y para las 2 cifras de la parte decimal basta con 1 byte. En total, se necesitan 3 bytes.

Valores de bits

TipoMemoriaRango
BIT[(M)]M bitsDe 1 a 64 bits, según el valor de M
BOOL
BOOLEAN
(sinónimos)
1 bit0 o 1

El tipo de datos BIT(M) guarda una secuencia de bits de longitud fija. Por defecto, la longitud es de 8 bits. Si el valor asignado a una columna de este tipo usa menos de M bits, se rellena con ceros por la izquierda. Por ejemplo, si intentas guardar el valor b'101' en BIT(6), al final se guardará b'000101'.

Números aproximados

TipoMemoriaRango
FLOAT[(M, D)]4 bytesValor mínimo ±1,17·10-39
Valor máximo ±3,4·1038
REAL[(M, D)]
DOUBLE[(M, D)]
(sinónimos)
8 bytesValor mínimo ±2,22·10-308
Valor máximo ±1,79·10308

Los tipos de datos numéricos de coma flotante también pueden llevar el parámetro UNSIGNED. Igual que en los tipos enteros, este atributo impide guardar valores negativos en la columna marcada, pero, a diferencia de los tipos enteros, el intervalo máximo de valores de la columna no cambia.

Números enteros

TipoMemoriaRango
SMALLINT2 bytesde -32.768 a 32.767
INT
INTEGER
(sinónimos)
4 bytesde -2.147.483.648 a 2.147.483.647
BIGINT8 bytesde -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807

Tipos autoincrementales

TipoMemoriaRango
SMALLSERIAL2 bytesde 1 a 32.767
SERIAL4 bytesde 1 a 2.147.483.647
BIGSERIAL8 bytesde 1 a 9.223.372.036.854.775.807

Los tipos SERIAL son pseudotipos para crear columnas autoincrementales. SERIAL equivale a INTEGER con una secuencia que se crea automáticamente.

Números reales exactos

TipoPrecisiónRango
DECIMAL[(precision, scale)]
NUMERIC[(precision, scale)]
(sinónimos)
Definida por el usuarioHasta 131.072 cifras antes del punto decimal y hasta 16.383 después

El tipo NUMERIC guarda el valor real exacto. Se usa cuando la precisión es crítica, por ejemplo, al guardar datos financieros.

Ejemplo de uso:

MySQL 8.4
CREATE TABLE Users (
    ...
    salary NUMERIC(10,2)
);

En este ejemplo se declara que en la columna salary se guardarán números de 10 cifras como máximo, 2 de las cuales corresponden a la parte decimal. Es decir, esta columna admitirá valores entre -99.999.999,99 y 99.999.999,99.

Números aproximados

TipoMemoriaPrecisiónRango
REAL4 bytes6 cifrasde 1E-37 a 1E+37
DOUBLE PRECISION8 bytes15 cifrasde 1E-307 a 1E+308

Los tipos de coma flotante se usan para cálculos aproximados. PostgreSQL también admite los valores especiales Infinity, -Infinity y NaN (no es un número).