8.1.1. Tipos de enteros
8.1.2. Números de precisión arbitrarios
8.1.3. Tipos de punto flotante
8.1.4. Tipos de serie

Los tipos numéricos constan de enteros de dos, cuatro y ocho bytes, números de coma flotante de cuatro y ocho bytes y decimales de precisión seleccionable. La Tabla 8.2 enumera los tipos disponibles.

Cuadro 8.2. Tipos numéricos

Nombre Tamaño de almacenamiento Descripción Distancia
smallint 2 bytes entero de rango pequeño -32768 al +32767
integer 4 bytes elección típica para entero -2147483648 al +2147483647
bigint 8 bytes entero de rango grande -9223372036854775808 al +9223372036854775807
decimal variable precisión especificada por el usuario, exacta hasta 131072 dígitos antes del punto decimal; hasta 16383 dígitos después del punto decimal
numeric variable precisión especificada por el usuario, exacta hasta 131072 dígitos antes del punto decimal; hasta 16383 dígitos después del punto decimal
real 4 bytes precisión variable, inexacta Precisión de 6 dígitos decimales
double precision 8 bytes precisión variable, inexacta Precisión de 15 dígitos decimales
smallserial 2 bytes pequeño entero autoincrementante 1 hasta 32767
serial 4 bytes entero autoincrementante 1 al 2147483647
bigserial 8 bytes entero grande autoincrementante 1 al 9223372036854775807

La sintaxis de las constantes para los tipos numéricos se describe en la Sección 4.1.2. Los tipos numéricos tienen un conjunto completo de funciones y operadores aritméticos correspondientes. Referirse a Capítulo 9 para más información. Las siguientes secciones describen los tipos en detalle.

8.1.1. Tipos de enteros

Los tipos smallint, integer, y bigint almacenar números enteros, es decir, números sin componentes fraccionarios, de varios rangos. Los intentos de almacenar valores fuera del rango permitido darán como resultado un error.

El tipo integer es la opción más común, ya que ofrece el mejor equilibrio entre rango, tamaño de almacenamiento y rendimiento. los smallint type generalmente solo se usa si el espacio en disco es escaso. los bigint El tipo est diseado para ser utilizado cuando el rango del integer el tipo es insuficiente.

SQL solo especifica los tipos de enteros integer (o int), smallint, y bigint. Los nombres de los tipos int2, int4, y int8 son extensiones, que también son utilizadas por algunos otros sistemas de bases de datos SQL.

8.1.2. Números de precisión arbitrarios

El tipo numeric Puede almacenar números con una gran cantidad de dígitos. Se recomienda especialmente para almacenar cantidades monetarias y otras cantidades donde se requiera exactitud. Cálculos con numeric los valores producen resultados exactos cuando es posible, por ejemplo, suma, resta, multiplicación. Sin embargo, los cálculos sobre numeric los valores son muy lentos en comparación con los tipos enteros o con los tipos de punto flotante descritos en la siguiente sección.

Usamos los siguientes términos a continuación: precisión de un numeric es el recuento total de dígitos significativos en el número entero, es decir, el número de dígitos a ambos lados del punto decimal. los escala de un numeric es el recuento de dígitos decimales en la parte fraccionaria, a la derecha del punto decimal. Entonces, el número 23.5141 tiene una precisión de 6 y una escala de 4. Se puede considerar que los números enteros tienen una escala de cero.

Tanto la precisión máxima como la escala máxima de un numeric La columna se puede configurar. Para declarar una columna de tipo numeric usa la sintaxis:

NUMERIC(precision, scale)

La precisión debe ser positiva, la escala cero o positiva. Alternativamente:

NUMERIC(precision)

selecciona una escala de 0. Especificando:

NUMERIC

sin ninguna precisión o escala crea una columna en la que se pueden almacenar valores numéricos de cualquier precisión y escala, hasta el límite de implementación de precisión. Una columna de este tipo no coaccionará los valores de entrada a ninguna escala en particular, mientras que numeric las columnas con una escala declarada forzarán los valores de entrada a esa escala. (El estándar SQL requiere una escala predeterminada de 0, es decir, coerción a la precisión de números enteros. Encontramos esto un poco inútil. Si le preocupa la portabilidad, siempre especifique la precisión y la escala explícitamente).

Nota

La precisión máxima permitida cuando se especifica explícitamente en la declaración de tipo es 1000; NUMERIC sin una precisión especificada está sujeta a los límites descritos en la Tabla 8.2.

Si la escala de un valor a almacenar es mayor que la escala declarada de la columna, el sistema redondeará el valor al número especificado de dígitos fraccionarios. Entonces, si el número de dígitos a la izquierda del punto decimal excede la precisión declarada menos la escala declarada, se genera un error.

Los valores numéricos se almacenan físicamente sin ceros iniciales o finales adicionales. Por lo tanto, la precisión y la escala declaradas de una columna son máximos, no asignaciones fijas. (En este sentido el numeric el tipo es más parecido a varchar(n) que a char(n).) El requisito de almacenamiento real es de dos bytes para cada grupo de cuatro dígitos decimales, más de tres a ocho bytes de sobrecarga.

Además de los valores numéricos ordinarios, el numeric tipo permite el valor especial NaN, sentido no un número. Cualquier operación en NaN produce otro NaN. Al escribir este valor como una constante en un comando SQL, debe ponerlo entre comillas, por ejemplo UPDATE table SET x = 'NaN'. En la entrada, el string NaN se reconoce sin distinción entre mayúsculas y minúsculas.

Nota

En la mayoría de las implementaciones del no un número concepto, NaN no se considera igual a ningún otro valor numérico (incluido NaN). A fin de permitir numeric valores que se ordenarán y usarán en índices basados ​​en árboles, PostgreSQL trata NaN valores iguales y mayores que todos losNaN valores.

Los tipos decimal y numeric son equivalentes. Ambos tipos forman parte del estándar SQL.

Al redondear valores, el numeric tipo redondea los empates lejos de cero, mientras que (en la mayoría de las máquinas) el real y double precision tipos de corbatas redondas al número par más cercano. Por ejemplo:

SELECT x,round(x::numeric)AS num_round,round(x::doubleprecision)AS dbl_round
FROM generate_series(-3.5,3.5,1)as x;
  x   | num_round | dbl_round
------+-----------+------------3.5|-4|-4-2.5|-3|-2-1.5|-2|-2-0.5|-1|-00.5|1|01.5|2|22.5|3|23.5|4|4(8rows)

8.1.3. Tipos de coma flotante

Los tipos de datos real y double precision son tipos numéricos inexactos de precisión variable. En todas las plataformas admitidas actualmente, estos tipos son implementaciones del estándar IEEE 754 para aritmética de coma flotante binaria (precisión simple y doble, respectivamente), en la medida en que el procesador subyacente, el sistema operativo y el compilador lo admitan.

Inexacto significa que algunos valores no se pueden convertir exactamente al formato interno y se almacenan como aproximaciones, por lo que almacenar y recuperar un valor puede mostrar ligeras discrepancias. La gestión de estos errores y cómo se propagan a través de los cálculos es el tema de toda una rama de las matemáticas y la informática y no se discutirá aquí, excepto por los siguientes puntos:

  • Si necesita un almacenamiento y cálculos exactos (por ejemplo, para importes monetarios), utilice el numeric escriba en su lugar.

  • Si desea hacer cálculos complicados con estos tipos para algo importante, especialmente si confía en cierto comportamiento en casos de límites (infinito, subdesbordamiento), debe evaluar la implementación con cuidado.

  • Es posible que comparar dos valores de punto flotante para la igualdad no siempre funcione como se esperaba.

En todas las plataformas compatibles actualmente, el real type tiene un rango de alrededor de 1E-37 a 1E + 37 con una precisión de al menos 6 dígitos decimales. los double precision type tiene un rango de alrededor de 1E-307 a 1E + 308 con una precisión de al menos 15 dígitos. Los valores demasiado grandes o demasiado pequeños provocarán un error. El redondeo puede tener lugar si la precisión de un número de entrada es demasiado alta. Los números demasiado cercanos a cero que no se pueden representar como distintos de cero causarán un error de subdesbordamiento.

De forma predeterminada, los valores de coma flotante se generan en forma de texto en su representación decimal precisa más corta; el valor decimal producido está más cerca del true valor binario almacenado que a cualquier otro valor representable en la misma precisión binaria. (Sin embargo, el valor de salida actualmente nunca es exactamente a medio camino entre dos valores representables, para evitar un error generalizado donde las rutinas de entrada no respetan adecuadamente la regla de redondeo al par más cercano) .Este valor utilizará como máximo 17 dígitos decimales significativos para float8 valores, y como máximo 9 dígitos para float4 valores.

Nota

Este formato de salida más corto y preciso es mucho más rápido de generar que el formato redondeado histórico.

Para compatibilidad con la salida generada por versiones anteriores de PostgreSQL, y para permitir que se reduzca la precisión de la salida, el parámetro extra_float_digits se puede utilizar para seleccionar la salida decimal redondeada. Establecer un valor de 0 restaura el valor predeterminado anterior de redondear el valor a 6 (para float4) o 15 (para float8) dígitos decimales significativos. Establecer un valor negativo reduce aún más el número de dígitos; por ejemplo, -2 redondearía la salida a 4 o 13 dígitos respectivamente.

Cualquier valor de extra_float_digits mayor que 0 selecciona el formato más corto y preciso.

Nota

Las aplicaciones que querían valores precisos históricamente han tenido que establecer extra_float_digits en 3 para obtenerlos. Para una máxima compatibilidad entre versiones, deberían continuar haciéndolo.

Además de los valores numéricos ordinarios, los tipos de coma flotante tienen varios valores especiales:

Infinity-InfinityNaN

Estos representan los valores especiales IEEE 754 infinito, infinito negativo, y no un número, respectivamente. Al escribir estos valores como constantes en un comando SQL, debe colocarlos entre comillas, por ejemplo UPDATE table SET x = '-Infinity'. En la entrada, estas cadenas se reconocen sin distinción entre mayúsculas y minúsculas.

Nota

IEEE754 especifica que NaN no debe compararse igual a cualquier otro valor de punto flotante (incluyendo NaN). Para permitir que los valores de punto flotante se clasifiquen y utilicen en índices basados ​​en árboles, PostgreSQL trata NaN valores iguales y mayores que todos losNaN valores.

PostgreSQL también admite las notaciones estándar de SQL float y float(p) para especificar tipos numéricos inexactos. Aquí, p especifica la precisión mínima aceptable en binario dígitos. PostgreSQL acepta float(1) para float(24) como seleccionar el real tipo, mientras float(25) para float(53) Seleccione double precision. Valores de p fuera del rango permitido dibuja un error. float sin precisión especificada se considera double precision.

8.1.4. Tipos de serie

Nota

Esta sección describe una forma específica de PostgreSQL para crear una columna de autoincremento. Otra forma es utilizar la función de columna de identidad estándar de SQL, descrita en CREATE TABLE.

Los tipos de datos smallserial, serial y bigserial no son true tipos, sino simplemente una conveniencia de notación para crear columnas de identificador único (similar a la AUTO_INCREMENT propiedad compatible con algunas otras bases de datos). En la implementación actual, especificando:

CREATETABLE tablename (
    colname SERIAL);

es equivalente a especificar:

CREATE SEQUENCE tablename_colname_seq ASinteger;CREATETABLE tablename (
    colname integerNOTNULLDEFAULT nextval('tablename_colname_seq'));ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

Por lo tanto, hemos creado una columna de números enteros y la hemos ordenado para que sus valores predeterminados se asignen desde un generador de secuencias. A NOT NULL se aplica una restricción para asegurar que una null no se puede insertar el valor. (En la mayoría de los casos, también querrá adjuntar un UNIQUE o PRIMARY KEY restricción para evitar que se inserten valores duplicados por accidente, pero esto no es automático.) Por último, la secuencia se marca como propiedad de la columna, de modo que se eliminará si se elimina la columna o la tabla.

Nota

Porque smallserial, serial y bigserial se implementan usando secuencias, puede haber “huecos” o huecos en la secuencia de valores que aparece en la columna, incluso si nunca se eliminan filas. Un valor asignado de la secuencia todavía se “agota” incluso si una fila que contiene ese valor nunca se inserta correctamente en la columna de la tabla. Esto puede suceder, por ejemplo, si la transacción de inserción se revierte. Ver nextval() en la Sección 9.17 para obtener más detalles.

Para insertar el siguiente valor de la secuencia en el serial columna, especifique que el serial a la columna se le debe asignar su valor predeterminado. Esto se puede hacer excluyendo la columna de la lista de columnas en el INSERT declaración, o mediante el uso de la DEFAULT palabra clave.

Los nombres de los tipos serial y serial4 son equivalentes: ambos crean integer columnas. Los nombres de los tipos bigserial y serial8 funcionan de la misma manera, excepto que crean un bigint columna. bigserial debe usarse si prevé el uso de más de 231 identificadores durante la vida útil de la tabla. Los nombres de los tipos smallserial y serial2 también funcionan de la misma manera, excepto que crean un smallint columna.

La secuencia creada para un serial La columna se elimina automáticamente cuando se elimina la columna propietaria. Puede eliminar la secuencia sin eliminar la columna, pero esto forzará la eliminación de la expresión predeterminada de la columna.

Anterior Hasta próximo
Capítulo 8. Tipos de datos Hogar 8.2. Tipos monetarios