Nuestro equipo de redactores ha pasado mucho tiempo investigando la respuesta a tus búsquedas, te brindamos la soluciones de modo que nuestro deseo es servirte de mucha apoyo.
- 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 (incluidoNaN
). A fin de permitirnumeric
valores que se ordenarán y usarán en índices basados en árboles, PostgreSQL trataNaN
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
-Infinity
NaN
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 (incluyendoNaN
). Para permitir que los valores de punto flotante se clasifiquen y utilicen en índices basados en árboles, PostgreSQL trataNaN
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
ybigserial
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. Vernextval()
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 |