Types

Postgres possède un riche environnement de types de données. Les utilisateurs peuvent ajouter de nouveaux types en utilisant la commande CREATE TYPE.

Table 1 indique les types généraux inclus dans PostgreSQL. La plupart des termes alternatifs listés dans la colonne "Aliases" sont des noms utilisés en interne par Postgres pour des raisons historiques. De plus, certains types utilisés en interne ou même déconseillés sont disponibles, mais ne sont pas listés ici.

Table 1. Types

Nom de typeAliasDescription
bigintint8signed eight-byte integer
bigserialserial8autoincrementing eight-byte integer
bit fixed-length bit string
bit varying(n)varbit(n)variable-length bit string
booleanboollogical Boolean (true/false)
box rectangular box in 2D plane
bytea binary data
character(n)char(n)fixed-length character string
character varying(n)varchar(n)variable-length character string
cidr IP network address
circle circle in 2D plane
date calendar date (year, month, day)
double precisionfloat8double precision floating-point number
inet IP host address
integerint, int4signed four-byte integer
interval(p) general-use time span
line infinite line in 2D plane
lseg line segment in 2D plane
macaddr MAC address
money US-style currency
numeric [ (p, s) ]decimal [ (p, s) ]exact numeric with selectable precision
oid object identifier
path open and closed geometric path in 2D plane
point geometric point in 2D plane
polygon closed geometric path in 2D plane
realfloat4single precision floating-point number
smallintint2signed two-byte integer
serialserial4autoincrementing four-byte integer
text variable-length character string
time [ (p) ] [ without time zone ] time of day
time [ (p) ] with time zonetimetztime of day, including time zone
timestamp [ (p) ] without time zonetimestampdate and time
timestamp [ (p) ] [ with time zone ]timestamptzdate and time, including time zone

NoteCompatibilité
 

Les types suivants sont spécifiques au SQL : bit, bit varying, boolean, char, character, character varying, varchar, date, double precision, integer, interval, numeric, decimal, real, smallint, time, timestamp (les deux avec ou sans zone horaire).

Chaque type a une représentation externe déterminée par ses fonctions entrée et sortie. Nombre de types natifs possèdent des formats évidents. Cependant, plusieurs types sont soit propres à PostgreSQL, soit ont plusieurs formats possibles comme les types date et time. La plupart des fonctions entrée/sortie correspondent aux types de base (ex., nombres entiers et décimaux). Certaines des fonctions entrée/sortie ne sont pas réversibles. Une fonction de sortie peut ainsi occasionner une perte de précision sur la donnée concernée.

Certains opérateurs et fonctions (ex., addition et multiplication) ne font pas de vérification d'erreur à la volée, afin de ne pas réduire la vitesse d'exécution. Sur certains sustèmes, par exemple, les opérateurs numériques pour certains types peuvent, de manière silencieuse, gérer les dépassements de capacité (underflow ou overflow).

Types numériques

Les types numériques consistent en entiers de 2-, 4- et 8- octets, de nombres décimaux de 4- et 8- octets et de décimaux de précision fixe.

Table 2. Types numériques

Nom du typeStockageDescriptionÉtendue
smallint2 bytesFixed-precision-32768 to +32767
integer4 bytesUsual choice for fixed-precision-2147483648 to +2147483647
bigint8 bytesVery large range fixed-precision-9223372036854775808 to 9223372036854775807
decimalvariableuser-specified precision, exactno limit
numericvariableuser-specified precision, exactno limit
real4 bytesvariable-precision, inexact6 decimal digits precision
double precision8 bytesvariable-precision, inexact15 decimal digits precision
serial4 bytesautoincrementing integer1 to 2147483647
bigserial8 bytesautoincrementing integer1 to 9223372036854775807

La syntaxe des constantes pour les types numériques est décrite dans the section called Constantes in the chapter called Syntaxe SQL. Les types numériques offrent un jeu complet de fonctions et d'opérateurs arithmétiques correspondants. Voir the chapter called Fonctions et Opérateurs pour plus d'information. Les sections suivantes décrivent les types en détail.

Types entier

Les types smallint, integer, bigint stockent l'ensemble des nombres, nombres sans composants de fraction, d'étendues variables. La tentative d'attribution de valeurs en dehors de leur étendue permise provoquera une erreur.

Le type integer est le choix habituel, en ce qu'il permet le meilleur équilibre entre l'étendue, la taille de stockage et la performance. Le type smallint est généralement utilisé si l'espace disque est réduit. Le type bigint sera utilisé seulement si l'étendue de integer n'est pas suffisante, car ce dernier est plus rapide.

Le type bigint peut ne pas fonctionner correctement sur toutes les plates-formes. bigint agit comme integer (mais prend plus de 8octets pour le stockage).

SQL spécifie uniquement les types entier integer (ou int) et smallint. Le type bigint, et les noms de type int2, int4, et int8 sont des extensions, lesquelles sont partagées avec d'autres SGBDR.

Note

Si vous avez une colonne de type smallint ou bigint avec un index, vous pouvez rencontrer des problèmes d'utilisation avec cet index. Par exemple, une clause de la forme :

... WHERE smallint_column = 42
n'utilisera pas un index, car le système assigne le type integer à la constante 42, et PostgreSQL n'utilise pas d'index quand deux types différents sont invoqués. Une solution est d'entourer la constante d'apostrophes, comme ceci :
... WHERE smallint_column = '42'
Le système différera la résolution de type et assignera le bon type à la constante.

Nombres à précision arbitraire

Le type numeric peut stocker des nombres de taille et de précision pratiquement illimitée. Il est particulièrement recommandé pour le stockage de montants monétaires et autres quantités où l'exactitude est nécessaire. Cependant, le type numeric est très lment comparé aux types décimaux décrits dans la section suivante.

Nous utilisons les termes: le terme scale d'un type numeric est la somme des décimales, à la droite de la virgule. Le terme precision d'un type numeric est la somme totale de décimales dans le nombre complet, i.e, le nombre de décimales des deux côtés de la virgule. Ainsi, le nombre 23.5141 a une précision de 6 et un scale de 4. Les entiers sont considérés comme ayant un scale de zero.

La précision et le scale d'un type numérique peuvent être configurés. Déclarer une colonne de type numeric utilise la syntaxe

NUMERIC(precision, scale)
La précision doit être positive, le scale zero ou positif. De façon alternative,
NUMERIC(precision)
selectionne un scale de 0. En spécifiant,
NUMERIC
sans aucune précision ou scale, crée une colonne dans laquelle des valeurs numériques de n'importe quelle précision ou scale peuvent être stockées, outrepassant la limite de précision. Une colonne de ce genre ne contraindra pas les valeurs d'entrée à un scale particulier, attendu que les colonnes numeric avec un scale déclaré forceront les valeurs d'entrée à ce scale. (Le standard SQL requiert un scale par défaut de 0, i.e, la coercition à l'exactitude de l'entier. Nous trouvons ceci peu pratique. Si vous être concernés au niveau de la portabilité, spécifiez toujours la précision et le scale).

Si la précision ou le scale d'une valeur est plus grand que la précision ou le scale déclaré d'une colonne, le système tentera d'arrondir la valeur. Si la valeur ne peut être arrondie, pour satisfaire les limites déclarées, une erreur apparaîtra.

Les types decimal et numeric sont équivalents. Ces deux types font partie du standard SQL.

Types décimaux

Les types real et double precision sont inexacts, types numériques à précision variable. En pratique, ces types sont des implémentations de binaires décimaux de IEEE 754 (simple et double précision, respectivement), pour le support du processeur, du système d'exploitation et du compilateur.

Inexact indique que certaines valeurs ne peuvent être converties exactement au format interne et sont stockées en tant approximations. La gestion des ces erreurs et leur propagation dans les calculs est le sujet d'une branche entière des mathématiques et de l'informatique et ne sera pas approfondie ici, sauf pour les points suivants :

  • Si vous avez besoin de calculs et de stockages exacts (comme des montants monétaires), utilisez le type numeric.

  • Si vous voulez des calculs compliqués avec ces types pour quelque chose d'important, spécialement si vous comptez sur certains comportements limites (infinity, underflow), vous devrez évaluer cette implémentation avec prudence.

  • Comparer deux valeurs décimales comme identiques peut, ou ne peut pas, fonctionner comme attendu.

Normalement, le type real a une étendue d'au moins -1E+37 à +1E+37 avec une précision d'au moins 6 décimales. Le type double precision possède normalement une étendue de -1E+308 to +1E+308 avec une précision d'au moins 15 décimales. Les valeurs trop grandes ou trop petites provoqueront une erreur. Ça peut être arrondi si la précision d'une entrée nombre est trop grande. Les nombres trop proches de zero et qu'on ne peut représenter comme distincts de zero provoqueront un dépassement de capacité (underflow).

Types Serial

Les types serial ne sont pas de vrais types, mais une facilité de notation pour la mise en place d'identifiants uniques de colonnes dans les tables. Spécifier :

CREATE TABLE tablename (
    colname SERIAL
);
est équivalent à :
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
    colname integer DEFAULT nextval('tablename_colname_seq') UNIQUE NOT NULL
);
Ainsi, nous avons créé une colonne entier et nous sommes arrangés pour que ses valeurs par défaut soient assignées depuis un générateur de séquences. Les contraintes UNIQUE et NOT NULL sont appliquées pour s'assurer que les valeurs insérées ne seront pas dupliquées.

Les noms de type serial et serial4 sont équivalents: les deux créent des colonnes integer. les noms de type bigserial et serial8 fonctionnent de la même façon, sauf qu'ils créent une colonne bigint. bigserial sera utilisé si vous prévoyez d'utiliser plus de 231 identifiants pendant la durée de vie de la table.

Les séquences implicites supportant les types serial ne sont pas automatiquement supprimées quand une table contenant un type serial est supprimée. Ainsi, les commandes suivantes exécutées dans cet ordre échoueront :

CREATE TABLE tablename (colname SERIAL);
DROP TABLE tablename;
CREATE TABLE tablename (colname SERIAL);
Les séquences resteront dans la base jusqu'à ce qu'une suppression explicite utilise DROP SEQUENCE. (Ce désagrément sera probablement modifié dans les futures versions).