Listado completo de tutoriales
16 - Tipo de dato numérico |
Ya explicamos que al crear una tabla debemos elegir la estructura adecuada, esto es, definir los campos y sus tipos más precisos, según el caso.
Para almacenar valores NUMERICOS PostgreSQL dispone de varios tipos.
Para almacenar valores ENTEROS, por ejemplo, en campos que hacen referencia a cantidades, usamos:
1) int (integer o int4): su rango es de -2000000000 a 2000000000 aprox.
2) smallint (int2): Puede contener hasta 5 digitos. Su rango va desde –32000 hasta 32000 aprox.
3) bigint (int8): De –9000000000000000000 hasta 9000000000000000000 aprox.
Los campos de tipo serial : se almacenan en un campo de tipo int
y los bigserial : se almacenan en un campo de tipo bigint.
Para almacenar valores numéricos EXACTOS con decimales, especificando la cantidad de cifras a la izquierda y derecha del separador decimal, utilizamos:
4) decimal o numeric (t,d): Pueden tener hasta 1000 digitos, guarda un valor exacto. El primer argumento indica el total de dígitos y el segundo, la cantidad de decimales.
Por ejemplo, si queremos almacenar valores entre -99.99 y 99.99 debemos definir el campo como tipo "decimal(4,2)".
Si no se indica el valor del segundo argumento, por defecto es "0". Por ejemplo, si definimos "decimal(4)" se pueden guardar valores entre -9999 y 9999.
El rango depende de los argumentos, también los bytes que ocupa.
Se utiliza el punto como separador de decimales.
Si ingresamos un valor con más decimales que los permitidos, redondea al más cercano; por ejemplo, si definimos "decimal(4,2)" e ingresamos el valor "12.686", guardará "12.69", redondeando hacia arriba; si ingresamos el valor "12.682", guardará "12.67", redondeando hacia abajo.
Para almacenar valores numéricos APROXIMADOS con decimales utilizamos:
5) float (real): De 1E-37 to 1E+37. Guarda valores aproximados.
6) double precision (float8): Desde 1E-307 to 1E+308. Guarda valores aproximados.
Para todos los tipos numéricos:
- si intentamos ingresar un valor fuera de rango, no lo permite.
- si ingresamos una cadena, PostgreSQL intenta convertirla a valor numérico, si dicha cadena consta solamente de dígitos, la conversión se realiza, luego verifica si está dentro del rango, si es así, la ingresa, sino, muestra un mensaje de error y no ejecuta la sentencia. Si la cadena contiene caracteres que PostgreSQL no puede convertir a valor numérico, muestra un mensaje de error y la sentencia no se ejecuta.
Por ejemplo, definimos un campo de tipo decimal(5,2), si ingresamos la cadena '12.22', la convierte al valor numérico 12.22 y la ingresa; si intentamos ingresar la cadena '1234.56', la convierte al valor numérico 1234.56, pero como el máximo valor permitido es 999.99, muestra un mensaje indicando que está fuera de rango. Si intentamos ingresar el valor '12y.25', PostgreSQL no puede realizar la conversión y muestra un mensaje de error.
Es importante elegir el tipo de dato adecuado según el caso, el más preciso. Por ejemplo, si un campo numérico almacenará valores positivos menores a 255, el tipo "int" no es el más adecuado, conviene el tipo "smallint", de esta manera usamos el menor espacio de almacenamiento posible.
drop table if exists libros; create table libros( codigo serial, titulo varchar(40) not null, autor varchar(30), editorial varchar(15), precio decimal(10,2), cantidad smallint, primary key (codigo) ); -- Analicemos la inserción de datos numéricos. insert into libros (titulo,autor,editorial,precio,cantidad) values('El aleph','Borges','Emece',25.6666, 260); -- Se redondea el campo precio por el valor 25.67. -- Intentamos ingresar un precio que supera el rango: insert into libros (titulo,autor,editorial, precio, cantidad) values('El aleph','Borges','Emece',120000000000.66, 260); -- aparece un mensaje de error y la instrucción no se ejecuta. -- Intentemos ingresar un valor mayor al permitido para el campo cantidad: insert into libros (titulo,autor,editorial,precio,cantidad) values('El aleph','Borges','Emece',25000,100000);
La ejecución de este lote de comandos SQL genera una salida similar a: