Data Type

1 h Niveau 1

Dans ce chapitre, nous allons parler des types de données utilisés dans PostgreSQL. Lors de la création d'une table, pour chaque colonne, vous spécifiez un type de données, c'est-à-dire le type de données que vous voulez stocker dans les champs de la table.

Cela permet plusieurs avantages :

  • Consistency − Les opérations sur des colonnes de même type de données donnent des résultats cohérents et sont généralement les plus rapides.
  • Validation − L'utilisation correcte des types de données implique la validation du format des données et le rejet des données hors de la portée du type de données.
  • Compactness − Comme une colonne peut stocker un seul type de valeur, elle est stockée de manière compacte.
  • Performance − Une utilisation appropriée des types de données permet un stockage plus efficace des données. Les valeurs stockées peuvent être traitées rapidement, ce qui améliore les performances.

PostgreSQL supporte un large ensemble de types de données. En outre, les utilisateurs peuvent créer leur propre type de données personnalisé en utilisant la commande SQL CREATE TYPE. Il existe différentes catégories de types de données dans PostgreSQL. Elles sont présentées ci-dessous.

Types numériques

Les types numériques se composent d'entiers de deux, quatre et huit octets, de nombres à virgule flottante de quatre et huit octets et de décimales de précision sélectionnable. Le tableau suivant répertorie les types disponibles.

Nom Taille de stockage Description Range
smallint 2 bytes Petit nombre d'entiers -32768 to +32767
integer 4 bytes Choix typique pour les entiers -2147483648 to +2147483647
bigint 8 bytes Grand nombre d'entiers -9223372036854775808 to 9223372036854775807
decimal variable Précision spécifiée par l'utilisateur, exact up to 131072 digits before the decimal point; up to 16383 digits after the decimal point
numeric variable Précision spécifiée par l'utilisateur, exact up to 131072 digits before the decimal point; up to 16383 digits after the decimal point
real 4 bytes Précision variable, inexacte 6 decimal digits precision
double precision 8 bytes Précision variable, inexacte 15 decimal digits precision
smallserial 2 bytes Petit entier auto incrémenté 1 to 32767
serial 4 bytes Nombre entier auto-incrémenté 1 to 2147483647
bigserial 8 bytes Grand entier auto incrémenté 1 to 9223372036854775807

Types monétaires

Le type money stocke un montant en devise avec une précision fractionnaire fixe. Les valeurs des types de données numeric, int et bigint peuvent être converties en argent. L'utilisation de nombres à virgule flottante n'est pas recommandée pour gérer l'argent en raison du risque d'erreurs d'arrondi.

Nom Taille de stockage Description Range
money 8 bytes Montant en devise -92233720368547758.08 to +92233720368547758.07

Types de caractères

La liste ci-dessous énumère les types de caractères à usage général disponibles dans PostgreSQL.

Name & Description

  • character varying(n), varchar(n) - Longueur variable avec limite.
  • character(n), char(n) - Longueur fixe, rembourré en blanc.
  • text - Longueur variable illimitée.

Le types Binary Data

Le type de données bytea permet de stocker des chaînes de caractères binaires comme dans le tableau ci-dessous :

Nom Taille de stockage Description
bytea 1 or 4 bytes plus the actual binary string Chaîne binaire de longueur variable

Types de dates et de temps

PostgreSQL supporte un ensemble complet de types de dates et d'heures SQL, comme indiqué dans le tableau ci-dessous. Les dates sont comptées selon le calendrier grégorien. Ici, tous les types ont une résolution de 1 microseconde / 14 chiffres, sauf le type de date, dont la résolution est le jour.

Nom Taille de stockage Description Valeur min Valeur max
timestamp [(p)] [without time zone ] 8 bytes La date et l'heure (sans fuseau horaire) 4713 BC 294276 AD
TIMESTAMPTZ 8 bytes La date et l'heure, avec le fuseau horaire 4713 BC 294276 AD
date 4 bytes Date (pas d'heure de la journée) 4713 BC 5874897 AD
time [ (p)] [ without time zone ] 8 bytes Heure de la journée (sans date) 00:00:00 24:00:00
time [ (p)] with time zone 12 bytes Les heures de la journée uniquement, avec le fuseau horaire 00:00:00+1459 24:00:00-1459
interval [fields ] [(p) ] 12 bytes Intervalle de temps -178000000 years 178000000 years

Le type Boolean

PostgreSQL fournit le type SQL standard Boolean. Le type de données booléen peut avoir les états true, false, et un troisième état, unknown, qui est représenté par la valeur SQL null.

Nom Taille de stockage Description
boolean 1 byte L'état de vrai ou faux

Le type Enumerated

Les types énumérés (enum) sont des types de données qui comprennent un ensemble statique et ordonné de valeurs. Ils sont équivalents aux types énumérés pris en charge dans un certain nombre de langages de programmation.

Contrairement aux autres types, les types énumérés doivent être créés à l'aide de la commande CREATE TYPE. Ce type est utilisé pour stocker un ensemble statique et ordonné de valeurs. Par exemple, les directions de la boussole, c'est-à-dire NORD, SUD, EST et OUEST, ou les jours de la semaine, comme indiqué ci-dessous.

CREATE TYPE week AS ENUM ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');

Une fois créés, les types énumérés peuvent être utilisés comme tous les autres types.

Le type geométrique

Les types de données géométriques représentent des objets spatiaux bidimensionnels. Le type le plus fondamental, le point, constitue la base de tous les autres types.

Nom Taille de stockage Représentation Description
point 16 bytes Point sur un plan (x,y)
line 32 bytes Ligne infinie (pas complètement implémentée) ((x1,y1),(x2,y2))
lseg 32 bytes Segment de ligne fini ((x1,y1),(x2,y2))
box 32 bytes Boîte rectangulaire ((x1,y1),(x2,y2))
path 16+16n bytes Chemin fermé (similaire à un polygone) ((x1,y1),...)
path 16+16n bytes Chemin ouvert [(x1,y1),...]
polygon 40+16n Polygone (similaire à un chemin fermé) ((x1,y1),...)
circle 24 bytes Cercle <(x,y),r> (center point and radius)

Le type Network Address

PostgreSQL offre des types de données pour stocker les adresses IPv4, IPv6 et MAC. Il est préférable d'utiliser ces types plutôt que des types de texte brut pour stocker les adresses réseau, car ces types offrent une vérification des erreurs d'entrée et des opérateurs et fonctions spécialisés.

Nom Taille de stockage Description
cidr 7 or 19 bytes Réseaux IPv4 et IPv6
inet 7 or 19 bytes Hôtes et réseaux IPv4 et IPv6
macaddr 6 bytes Adresses MAC

Le type Bit String

Les types de chaînes de bits sont utilisés pour stocker les masques de bits. Ils sont soit 0 soit 1. Il existe deux types de bits SQL : bit(n) et bit variant(n), où n est un nombre entier positif.

Le type de recherche de texte

Ce type prend en charge la recherche en texte intégral, qui consiste à parcourir une collection de documents en langage naturel pour trouver ceux qui correspondent le mieux à une requête. Il existe deux types de données pour ce type :

Nom et description

  • tsvector - Il s'agit d'une liste triée de mots distincts qui ont été normalisés pour fusionner différentes variantes d'un même mot, appelées "lexèmes".
  • tsquery - Il stocke les lexèmes à rechercher, et les combine en respectant les opérateurs booléens & (AND), | (OR), et ! (NOT). Les parenthèses peuvent être utilisées pour imposer le regroupement des opérateurs.

Le type UUID

Un UUID (Universally Unique Identifiers) s'écrit comme une séquence de chiffres hexadécimaux minuscules, en plusieurs groupes séparés par des traits d'union, plus précisément un groupe de huit chiffres, suivi de trois groupes de quatre chiffres, suivis d'un groupe de 12 chiffres, pour un total de 32 chiffres représentant les 128 bits.

Un exemple d'UUID est - 550e8400-e29b-41d4-a716-446655440000

Le type XML

Le type de données XML peut être utilisé pour stocker des données XML. Pour stocker des données XML, vous devez d'abord créer des valeurs XML à l'aide de la fonction xmlparse, comme suit :

XMLPARSE (DOCUMENT '<?xml version="1.0"?>
<tutorial>
<title>PostgreSQL Tutorial </title>
    <topics>...</topics>
</tutorial>')

XMLPARSE (CONTENT 'xyz<foo>bar</foo><bar>foo</bar>')

Le type JSON

Le type de données json peut être utilisé pour stocker des données JSON (JavaScript Object Notation). Ces données peuvent également être stockées sous forme de texte, mais le type de données json présente l'avantage de vérifier que chaque valeur stockée est une valeur JSON valide. Il existe également des fonctions de support associées, qui peuvent être utilisées directement pour manipuler le type de données JSON comme suit.

Exemple Résultat
array_to_json('{{1,5},{99,100}}'::int[]) [[1,5],[99,100]]
row_to_json(row(1,'foo')) {"f1":1,"f2":"foo"}

Le type Array

PostgreSQL offre la possibilité de définir une colonne d'une table comme un tableau multidimensionnel de longueur variable. Des tableaux de n'importe quel type de base intégré ou défini par l'utilisateur, de type enum ou de type composite peuvent être créés.

Déclaration de tableaux

Le type de tableau peut être déclaré comme ci-dessous :

CREATE TABLE monthly_savings (
    name text,
    saving_per_quarter integer[],
    scheme text[][]
);

ou en utilisant le mot clé "ARRAY" comme ci-dessous :

CREATE TABLE monthly_savings (
    name text,
    saving_per_quarter integer ARRAY[4],
    scheme text[][]
);

Insertion de valeurs

Les valeurs d'un tableau peuvent être insérées comme une constante littérale, en enfermant les valeurs des éléments entre accolades et en les séparant par des virgules. Un exemple est présenté ci-dessous :

INSERT INTO monthly_savings 
VALUES ('Manisha', 
'{20000, 14600, 23500, 13250}', 
'{{"FD", "MF"}, {"FD", "Property"}}');

Accès aux tableaux

Un exemple d'accès aux tableaux est présenté ci-dessous. La commande donnée ci-dessous sélectionnera les personnes dont l'épargne est plus importante au deuxième trimestre qu'au quatrième trimestre.

SELECT name FROM monhly_savings WHERE saving_per_quarter[2] > saving_per_quarter[4];

Modification de tableaux

Un exemple de modification de tableaux est présenté ci-dessous :

UPDATE monthly_savings SET saving_per_quarter = '{25000,25000,27000,27000}'
WHERE name = 'Manisha';

ou en utilisant la syntaxe de l'expression ARRAY :

UPDATE monthly_savings SET saving_per_quarter = ARRAY[25000,25000,27000,27000]
WHERE name = 'Manisha';

Recherche dans les tableaux

Un exemple de recherche dans des tableaux est présenté ci-dessous :

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 la taille du tableau est connue, la méthode de recherche donnée ci-dessus peut être utilisée. Sinon, l'exemple suivant montre comment rechercher lorsque la taille n'est pas connue.

SELECT * FROM monthly_savings WHERE 10000 = ANY (saving_per_quarter);

Types composites

Ce type représente une liste de noms de champs et leurs types de données, c'est-à-dire la structure d'une ligne ou d'un enregistrement d'une table.

Déclaration de types composite

L'exemple suivant montre comment déclarer un type composite :

CREATE TYPE inventory_item AS (
    name text,
    supplier_id integer,
    price numeric
);

Ce type de données peut être utilisé dans les tables de création comme ci-dessous :

CREATE TABLE on_hand (
    item inventory_item,
    count integer
);

Valeurs composées

Les valeurs composées peuvent être insérées comme une constante littérale, en mettant les valeurs des champs entre parenthèses et en les séparant par des virgules. Un exemple est présenté ci-dessous :

INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);

Ceci est valable pour l'inventaire_item défini ci-dessus. Le mot clé ROW est en fait facultatif tant que vous avez plus d'un champ dans l'expression.

Accéder à un champ d'un type composite

Pour accéder à un champ d'une colonne composite, utilisez un point suivi du nom du champ, comme pour sélectionner un champ à partir d'un nom de table. Par exemple, pour sélectionner certains sous-champs de notre table d'exemple on_hand, la requête serait la suivante :

SELECT (item).name FROM on_hand WHERE (item).price > 9.99;

Vous pouvez même utiliser également le nom de la table (par exemple dans une requête multitable), comme ceci :

SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9.99;

Les types de plage

Les types de plage représentent des types de données qui utilisent une plage de données. Les types de plage peuvent être des plages discrètes (par exemple, toutes les valeurs entières de 1 à 10) ou des plages continues (par exemple, tout point dans le temps entre 10h00 et 11h00).

Les types de plage intégrés disponibles incluent les plages suivantes :

  • int4range − Gamme d'entiers.
  • int8range − Plage de bigint.
  • numrange − Plage de valeurs numériques.
  • tsrange − Plage d'horodatage sans fuseau horaire.
  • tstzrange − Plage de l'horodatage avec le fuseau horaire.
  • daterange − Plage de dates.

Il est possible de créer des types de plages personnalisés pour mettre à disposition de nouveaux types de plages, tels que des plages d'adresses IP utilisant le type inet comme base, ou des plages de valeurs flottantes utilisant le type de données float comme base.

Les types de plage prennent en charge les limites de plage inclusives et exclusives à l'aide des caractères [ ] et ( ), respectivement. Par exemple, '[4,9)' représente tous les entiers à partir de 4 inclus jusqu'à 9 non inclus.

Identifiants d'objets

Les identifiants d'objets (OID) sont utilisés en interne par PostgreSQL comme clés primaires pour diverses tables système. Si WITH OIDS est spécifié ou si la variable de configuration default_with_oids est activée, alors seulement, dans ce cas, les OIDs sont ajoutés aux tables créées par l'utilisateur. Le tableau suivant répertorie plusieurs types d'alias. Les types d'alias OID n'ont pas d'opérations propres, à l'exception des routines d'entrée et de sortie spécialisées.

Nom Références Description Exemple de valeur
oid any Identifiant numérique de l'objet 564182
regproc pg_proc Nom de la fonction sum
regprocedure pg_proc Fonction avec des types d'arguments sum(int4)
regoper pg_operator Nom de l'opérateur +
regoperator pg_operator Opérateur avec des types d'arguments *(integer,integer) or -(NONE,integer)
regclass pg_class Nom de la relation pg_type
regtype pg_type Nom du type de données integer
regconfig pg_ts_config Configuration de la recherche de texte English
regdictionary pg_ts_dict Recherche de texte dans un dictionnaire simple

Pseudo Types

Le système de type PostgreSQL contient un certain nombre d'entrées à usage spécial qui sont collectivement appelées pseudo-types. Un pseudo-type ne peut pas être utilisé comme un type de données de colonne, mais il peut être utilisé pour déclarer le type d'argument ou de résultat d'une fonction.

Le tableau ci-dessous liste les pseudo-types existants.

Nom et description

  • any - Indique qu'une fonction accepte tout type de données d'entrée.
  • anyelement - Indique qu'une fonction accepte n'importe quel type de données.
  • anyarray - Indique qu'une fonction accepte tout type de données de tableau.
  • anynonarray - Indique qu'une fonction accepte tout type de données hors tableau.
  • anyenum - Indique qu'une fonction accepte tout type de données d'énumération.
  • anyrange - Indique qu'une fonction accepte tout type de données de plage.
  • cstring - Indique qu'une fonction accepte ou renvoie une chaîne de caractères C à terminaison nulle.
  • internal - Indique qu'une fonction accepte ou renvoie un type de données interne au serveur.
  • language_handler - Un gestionnaire d'appel de langage procédural est déclaré pour renvoyer language_handler.
  • fdw_handler - Un gestionnaire d'enveloppe de données étrangères est déclaré pour renvoyer fdw_handler.
  • record - Identifie une fonction renvoyant un type de ligne non spécifié.
  • trigger - Une fonction trigger est déclarée pour renvoyer trigger.
  • void - Indique qu'une fonction ne renvoie aucune valeur.
logo discord

Besoin d'aide ?

Rejoignez notre communauté officielle et ne restez plus seul à bloquer sur un problème !

En savoir plus