PostgreSQL - Tipo de datos
En este capítulo, analizaremos los tipos de datos utilizados en PostgreSQL. Al crear la tabla, para cada columna, especifica un tipo de datos, es decir, qué tipo de datos desea almacenar en los campos de la tabla.
Esto permite varios beneficios:
Consistency - Las operaciones contra columnas del mismo tipo de datos dan resultados consistentes y suelen ser las más rápidas.
Validation - El uso adecuado de los tipos de datos implica la validación del formato de los datos y el rechazo de los datos fuera del alcance del tipo de datos.
Compactness - Como una columna puede almacenar un solo tipo de valor, se almacena de forma compacta.
Performance- El uso adecuado de los tipos de datos proporciona el almacenamiento de datos más eficiente. Los valores almacenados se pueden procesar rápidamente, lo que mejora el rendimiento.
PostgreSQL admite un amplio conjunto de tipos de datos. Además, los usuarios pueden crear su propio tipo de datos personalizados usando el comando CREATE TYPE SQL. Hay diferentes categorías de tipos de datos en PostgreSQL. Se comentan a continuación.
Tipos numéricos
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 siguiente tabla enumera los tipos disponibles.
Nombre | Tamaño de almacenamiento | Descripción | Rango |
---|---|---|---|
pequeño | 2 bytes | entero de rango pequeño | -32768 al +32767 |
entero | 4 bytes | elección típica para entero | -2147483648 al +2147483647 |
Empezando | 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 |
numérico | 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 |
Precisión doble | 8 bytes | precisión variable, inexacta | Precisión de 15 dígitos decimales |
pequeña serie | 2 bytes | pequeño entero autoincrementante | 1 hasta 32767 |
de serie | 4 bytes | entero autoincrementante | 1 al 2147483647 |
bigserial | 8 bytes | entero grande autoincrementante | 1 al 9223372036854775807 |
Tipos monetarios
El tipo de dinero almacena una cantidad de moneda con una precisión fraccionaria fija. Los valores de los tipos de datos numérico, int y bigint se pueden convertir en dinero . No se recomienda el uso de números de coma flotante para manejar dinero debido a la posibilidad de errores de redondeo.
Nombre | Tamaño de almacenamiento | Descripción | Rango |
---|---|---|---|
dinero | 8 bytes | cantidad de moneda | -92233720368547758.08 al +92233720368547758.07 |
Tipos de caracteres
La tabla que se proporciona a continuación enumera los tipos de caracteres de uso general disponibles en PostgreSQL.
S. No. | Nombre y descripción |
---|---|
1 | character varying(n), varchar(n) longitud variable con límite |
2 | character(n), char(n) de longitud fija, en blanco acolchado |
3 | text longitud ilimitada variable |
Tipos de datos binarios
El tipo de datos bytea permite el almacenamiento de cadenas binarias como se muestra en la siguiente tabla.
Nombre | Tamaño de almacenamiento | Descripción |
---|---|---|
bytea | 1 o 4 bytes más la cadena binaria real | cadena binaria de longitud variable |
Tipos de fecha / hora
PostgreSQL admite un conjunto completo de tipos de fecha y hora de SQL, como se muestra en la tabla siguiente. Las fechas se cuentan según el calendario gregoriano. Aquí, todos los tipos tienen resolución de1 microsecond / 14 digits excepto date tipo, cuya resolución es day.
Nombre | Tamaño de almacenamiento | Descripción | Bajo valor | Alto valor |
---|---|---|---|---|
marca de tiempo [(p)] [sin zona horaria] | 8 bytes | tanto la fecha como la hora (sin zona horaria) | 4713 a. C. | 294276 AD |
TIMESTAMPTZ | 8 bytes | tanto la fecha como la hora, con la zona horaria | 4713 a. C. | 294276 AD |
fecha | 4 bytes | fecha (sin hora del día) | 4713 a. C. | 5874897 AD |
hora [(p)] [sin zona horaria] | 8 bytes | hora del día (sin fecha) | 00:00:00 | 24:00:00 |
hora [(p)] con zona horaria | 12 bytes | solo horas del día, con zona horaria | 00: 00: 00 + 1459 | 24: 00: 00-1459 |
intervalo [campos] [(p)] | 12 bytes | intervalo de tiempo | -178000000 años | 178000000 años |
Tipo booleano
PostgreSQL proporciona el tipo de SQL estándar Boolean. El tipo de datos booleano puede tener los estados verdadero , falso y un tercer estado, desconocido , que está representado por el valor nulo de SQL.
Nombre | Tamaño de almacenamiento | Descripción |
---|---|---|
booleano | 1 byte | estado de verdadero o falso |
Tipo enumerado
Los tipos enumerados (enum) son tipos de datos que comprenden un conjunto de valores estático y ordenado. Son equivalentes a los tipos de enumeración admitidos en varios lenguajes de programación.
A diferencia de otros tipos, los tipos enumerados deben crearse mediante el comando CREATE TYPE. Este tipo se utiliza para almacenar un conjunto de valores estático y ordenado. Por ejemplo, direcciones de la brújula, es decir, NORTE, SUR, ESTE y OESTE o días de la semana como se muestra a continuación:
CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
Enumerado, una vez creado, se puede utilizar como cualquier otro tipo.
Tipo geométrico
Los tipos de datos geométricos representan objetos espaciales bidimensionales. El tipo más fundamental, el punto, forma la base de todos los demás tipos.
Nombre | Tamaño de almacenamiento | Representación | Descripción |
---|---|---|---|
punto | 16 bytes | Punto en un avión | (x, y) |
línea | 32 bytes | Línea infinita (no implementada completamente) | ((x1, y1), (x2, y2)) |
lseg | 32 bytes | Segmento de línea finita | ((x1, y1), (x2, y2)) |
caja | 32 bytes | Caja rectangular | ((x1, y1), (x2, y2)) |
camino | 16 + 16n bytes | Camino cerrado (similar al polígono) | ((x1, y1), ...) |
camino | 16 + 16n bytes | Camino abierto | [(x1, y1), ...] |
polígono | 40 + 16n | Polígono (similar al camino cerrado) | ((x1, y1), ...) |
circulo | 24 bytes | Circulo | <(x, y), r> (punto central y radio) |
Tipo de dirección de red
PostgreSQL ofrece tipos de datos para almacenar direcciones IPv4, IPv6 y MAC. Es mejor usar estos tipos en lugar de tipos de texto sin formato para almacenar direcciones de red, porque estos tipos ofrecen verificación de errores de entrada y operadores y funciones especializados.
Nombre | Tamaño de almacenamiento | Descripción |
---|---|---|
cidr | 7 o 19 bytes | Redes IPv4 e IPv6 |
inet | 7 o 19 bytes | Redes y hosts IPv4 e IPv6 |
macaddr | 6 bytes | Direcciones MAC |
Tipo de cadena de bits
Los tipos de cadenas de bits se utilizan para almacenar máscaras de bits. Son 0 o 1. Hay dos tipos de bits SQL:bit(n) y bit varying(n), donde n es un número entero positivo.
Tipo de búsqueda de texto
Este tipo admite la búsqueda de texto completo, que es la actividad de buscar a través de una colección de documentos en lenguaje natural para ubicar los que mejor coinciden con una consulta. Hay dos tipos de datos para esto:
S. No. | Nombre y descripción |
---|---|
1 | tsvector Esta es una lista ordenada de palabras distintas que se han normalizado para fusionar diferentes variantes de la misma palabra, llamadas "lexemas". |
2 | tsquery Esto almacena los lexemas que se van a buscar y los combina respetando los operadores booleanos & (Y), | (O y ! (NO). Se pueden utilizar paréntesis para imponer la agrupación de los operadores. |
Tipo de UUID
Un UUID (Universal Unique Identifiers) se escribe como una secuencia de dígitos hexadecimales en minúsculas, en varios grupos separados por guiones, específicamente un grupo de ocho dígitos, seguido de tres grupos de cuatro dígitos, seguido de un grupo de 12 dígitos, para un total de 32 dígitos que representan los 128 bits.
Un ejemplo de UUID es: 550e8400-e29b-41d4-a716-446655440000
Tipo XML
El tipo de datos XML se puede utilizar para almacenar datos XML. Para almacenar datos XML, primero debe crear valores XML utilizando la función xmlparse de la siguiente manera:
XMLPARSE (DOCUMENT '<?xml version="1.0"?>
<tutorial>
<title>PostgreSQL Tutorial </title>
<topics>...</topics>
</tutorial>')
XMLPARSE (CONTENT 'xyz<foo>bar</foo><bar>foo</bar>')
Tipo JSON
El tipo de datos json se puede utilizar para almacenar datos JSON (notación de objetos JavaScript). Dichos datos también se pueden almacenar como texto , pero el tipo de datos json tiene la ventaja de verificar que cada valor almacenado sea un valor JSON válido. También hay funciones de soporte relacionadas disponibles, que se pueden usar directamente para manejar el tipo de datos JSON de la siguiente manera.
Ejemplo | Resultado de ejemplo |
---|---|
array_to_json ('{{1,5}, {99,100}}' :: int []) | [[1,5], [99,100]] |
fila_a_json (fila (1, 'foo')) | {"f1": 1, "f2": "foo"} |
Tipo de matriz
PostgreSQL brinda la oportunidad de definir una columna de una tabla como una matriz multidimensional de longitud variable. Se pueden crear matrices de cualquier tipo de base, tipo de enumeración o tipo compuesto integrado o definido por el usuario.
Declaración de matrices
El tipo de matriz se puede declarar como
CREATE TABLE monthly_savings (
name text,
saving_per_quarter integer[],
scheme text[][]
);
o utilizando la palabra clave "ARRAY" como
CREATE TABLE monthly_savings (
name text,
saving_per_quarter integer ARRAY[4],
scheme text[][]
);
Insertar valores
Los valores de matriz se pueden insertar como una constante literal, encerrando los valores del elemento entre llaves y separándolos por comas. A continuación se muestra un ejemplo:
INSERT INTO monthly_savings
VALUES (‘Manisha’,
‘{20000, 14600, 23500, 13250}’,
‘{{“FD”, “MF”}, {“FD”, “Property”}}’);
Acceso a matrices
A continuación, se muestra un ejemplo para acceder a las matrices. El comando dado a continuación seleccionará a las personas cuyos ahorros son más en el segundo trimestre que en el cuarto trimestre.
SELECT name FROM monhly_savings WHERE saving_per_quarter[2] > saving_per_quarter[4];
Modificar matrices
Un ejemplo de modificación de matrices se muestra a continuación.
UPDATE monthly_savings SET saving_per_quarter = '{25000,25000,27000,27000}'
WHERE name = 'Manisha';
o usando la sintaxis de expresión ARRAY -
UPDATE monthly_savings SET saving_per_quarter = ARRAY[25000,25000,27000,27000]
WHERE name = 'Manisha';
Buscando matrices
Un ejemplo de búsqueda de matrices se muestra a continuación.
SELECT * FROM monthly_savings WHERE saving_per_quarter[1] = 10000 OR
saving_per_quarter[2] = 10000 OR
saving_per_quarter[3] = 10000 OR
saving_per_quarter[4] = 10000;
Si se conoce el tamaño de la matriz, se puede utilizar el método de búsqueda indicado anteriormente. De lo contrario, el siguiente ejemplo muestra cómo buscar cuando no se conoce el tamaño.
SELECT * FROM monthly_savings WHERE 10000 = ANY (saving_per_quarter);
Tipos compuestos
Este tipo representa una lista de nombres de campo y sus tipos de datos, es decir, estructura de una fila o registro de una tabla.
Declaración de tipos compuestos
El siguiente ejemplo muestra cómo declarar un tipo compuesto
CREATE TYPE inventory_item AS (
name text,
supplier_id integer,
price numeric
);
Este tipo de datos se puede utilizar en las tablas de creación como se muestra a continuación:
CREATE TABLE on_hand (
item inventory_item,
count integer
);
Entrada de valor compuesto
Los valores compuestos se pueden insertar como una constante literal, encerrando los valores de campo entre paréntesis y separándolos por comas. A continuación se muestra un ejemplo:
INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);
Esto es válido para el elemento de inventario definido anteriormente. La palabra clave ROW es realmente opcional siempre que tenga más de un campo en la expresión.
Acceso a tipos compuestos
Para acceder a un campo de una columna compuesta, utilice un punto seguido del nombre del campo, de forma muy similar a seleccionar un campo de un nombre de tabla. Por ejemplo, para seleccionar algunos subcampos de nuestra tabla de ejemplo on_hand, la consulta sería como se muestra a continuación:
SELECT (item).name FROM on_hand WHERE (item).price > 9.99;
Incluso puede usar el nombre de la tabla también (por ejemplo, en una consulta de múltiples tablas), así:
SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;
Tipos de rango
Los tipos de rango representan tipos de datos que utilizan un rango de datos. El tipo de rango puede ser rangos discretos (por ejemplo, todos los valores enteros de 1 a 10) o rangos continuos (por ejemplo, cualquier momento entre las 10:00 am y las 11:00 am).
Los tipos de rango integrados disponibles incluyen los siguientes rangos:
int4range - Rango de entero
int8range - Rango de bigint
numrange - Rango de numérico
tsrange - Rango de marca de tiempo sin zona horaria
tstzrange - Rango de marca de tiempo con zona horaria
daterange - Rango de fecha
Se pueden crear tipos de rango personalizados para que estén disponibles nuevos tipos de rangos, como rangos de direcciones IP usando el tipo inet como base, o rangos flotantes usando el tipo de datos flotante como base.
Los tipos de rango admiten límites de rango inclusivos y exclusivos utilizando los caracteres [] y (), respectivamente. Por ejemplo, '[4,9)' representa todos los números enteros comenzando desde e incluyendo 4 hasta pero sin incluir 9.
Tipos de identificadores de objetos
PostgreSQL utiliza internamente identificadores de objetos (OID) como claves principales para varias tablas del sistema. Si se especifica WITH OIDS o la variable de configuración default_with_oids está habilitada, solo entonces, en tales casos, los OID se agregan a las tablas creadas por el usuario. La siguiente tabla enumera varios tipos de alias. Los tipos de alias de OID no tienen operaciones propias, excepto las rutinas especializadas de entrada y salida.
Nombre | Referencias | Descripción | Ejemplo de valor |
---|---|---|---|
oid | ninguna | identificador de objeto numérico | 564182 |
regproc | pg_proc | nombre de la función | suma |
reglamento | pg_proc | función con tipos de argumentos | suma (int4) |
regoper | pg_operator | nombre del operador | + |
regoperador | pg_operator | operador con tipos de argumentos | * (entero, entero) o - (NINGUNO, entero) |
regclass | pg_class | nombre de la relación | pg_type |
regtipo | pg_type | nombre del tipo de datos | entero |
regconfig | pg_ts_config | configuración de búsqueda de texto | Inglés |
regdiccionario | pg_ts_dict | diccionario de búsqueda de texto | simple |
Pseudo tipos
El sistema de tipos de PostgreSQL contiene una serie de entradas de propósito especial que se denominan colectivamente pseudo-tipos. Un pseudo-tipo no se puede usar como un tipo de datos de columna, pero se puede usar para declarar el argumento de una función o el tipo de resultado.
La tabla que se proporciona a continuación enumera los pseudo-tipos existentes.
S. No. | Nombre y descripción |
---|---|
1 | any Indica que una función acepta cualquier tipo de datos de entrada. |
2 | anyelement Indica que una función acepta cualquier tipo de datos. |
3 | anyarray Indica que una función acepta cualquier tipo de datos de matriz. |
4 | anynonarray Indica que una función acepta cualquier tipo de datos que no sea de matriz. |
5 | anyenum Indica que una función acepta cualquier tipo de datos de enumeración. |
6 | anyrange Indica que una función acepta cualquier tipo de datos de rango. |
7 | cstring Indica que una función acepta o devuelve una cadena C terminada en nulo. |
8 | internal Indica que una función acepta o devuelve un tipo de datos interno del servidor. |
9 | language_handler Se declara que un controlador de llamadas de lenguaje procedimental devuelve language_handler. |
10 | fdw_handler Se declara que un controlador de contenedor de datos externos devuelve fdw_handler. |
11 | record Identifica una función que devuelve un tipo de fila no especificado. |
12 | trigger Se declara que una función de disparo devuelve un disparador. |
13 | void Indica que una función no devuelve ningún valor. |