| Documentation PostgreSQL 7.2 | ||
|---|---|---|
| <<< Previous | Next >>> | |
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 type | Alias | Description |
|---|---|---|
| bigint | int8 | signed eight-byte integer |
| bigserial | serial8 | autoincrementing eight-byte integer |
| bit | fixed-length bit string | |
| bit varying(n) | varbit(n) | variable-length bit string |
| boolean | bool | logical 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 precision | float8 | double precision floating-point number |
| inet | IP host address | |
| integer | int, int4 | signed 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 | |
| real | float4 | single precision floating-point number |
| smallint | int2 | signed two-byte integer |
| serial | serial4 | autoincrementing four-byte integer |
| text | variable-length character string | |
| time [ (p) ] [ without time zone ] | time of day | |
| time [ (p) ] with time zone | timetz | time of day, including time zone |
| timestamp [ (p) ] without time zone | timestamp | date and time |
| timestamp [ (p) ] [ with time zone ] | timestamptz | date and time, including time zone |
![]() | Compatibilité |
|---|---|
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).
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 type | Stockage | Description | Étendue |
|---|---|---|---|
| smallint | 2 bytes | Fixed-precision | -32768 to +32767 |
| integer | 4 bytes | Usual choice for fixed-precision | -2147483648 to +2147483647 |
| bigint | 8 bytes | Very large range fixed-precision | -9223372036854775808 to 9223372036854775807 |
| decimal | variable | user-specified precision, exact | no limit |
| numeric | variable | user-specified precision, exact | no limit |
| real | 4 bytes | variable-precision, inexact | 6 decimal digits precision |
| double precision | 8 bytes | variable-precision, inexact | 15 decimal digits precision |
| serial | 4 bytes | autoincrementing integer | 1 to 2147483647 |
| bigserial | 8 bytes | autoincrementing integer | 1 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.
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.
![]() | 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 :
|
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) |
NUMERIC(precision) |
NUMERIC |
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.
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).
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
); |
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
colname integer DEFAULT nextval('tablename_colname_seq') UNIQUE NOT NULL
); |
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); |
| <<< Previous | Home | Next >>> |
| LIMIT et OFFSET | Up | Type monétaire |