root/traduc/trunk/postgresql/datatype.xml

Revision 1080, 154.1 kB (checked in by sas, 5 months ago)

Il est grand temps que je reprenne le travail :-(

  • Property svn:keywords set to Date Author Revision
Line 
1 <?xml version="1.0" encoding="ISO-8859-15"?>
2 <!-- Dernière modification
3      le       $Date$
4      par      $Author$
5      révision $Revision$ -->
6
7  <chapter id="datatype">
8   <title id="datatype-title">Types de données</title>
9
10   <indexterm zone="datatype">
11    <primary>Types de données</primary>
12   </indexterm>
13
14   <indexterm>
15    <primary>type</primary>
16    <see>type de données</see>
17   </indexterm>
18
19   <para>
20    <productname>PostgreSQL</productname> offre un large choix de types de
21    données disponibles nativement.
22    Les utilisateurs peuvent ajouter de nouveaux types à
23    <productname>PostgreSQL</productname> en utilisant la commande <xref
24    linkend="sql-createtype" endterm="sql-createtype-title"/>.
25   </para>
26
27   <para>
28    Le <xref linkend="datatype-table"/> montre tous les types de données
29    généraux disponibles nativement.
30    La plupart des types de données alternatifs listés dans la colonne
31    <quote>Alias</quote> sont les noms utilisés en interne par
32    <productname>PostgreSQL</productname> pour des raisons historiques.
33    Il existe également d'autres types de données internes ou obsolètes,
34    mais ils ne sont pas listés ici.
35  
36   </para>
37
38    <table id="datatype-table">
39     <title>Types de données</title>
40     <tgroup cols="3">
41      <colspec colnum="1" colwidth="2*"/>
42      <colspec colnum="2" colwidth="1*"/>
43      <colspec colnum="3" colwidth="3*"/>
44      <thead>
45       <row>
46        <entry>Nom</entry>
47        <entry>Alias</entry>
48        <entry>Description</entry>
49       </row>
50      </thead>
51
52      <tbody>
53       <row>
54        <entry><type>bigint</type></entry>
55        <entry><type>int8</type></entry>
56        <entry>Entier signé sur 8 octets</entry>
57       </row>
58
59       <row>
60        <entry><type>bigserial</type></entry>
61        <entry><type>serial8</type></entry>
62        <entry>Entier sur 8 octets à incrémentation automatique</entry>
63       </row>
64
65       <row>
66        <entry><type>bit [ (<replaceable>n</replaceable>) ]</type></entry>
67        <entry></entry>
68        <entry>Suite de bits de longueur fixe</entry>
69       </row>
70
71       <row>
72        <entry><type>bit varying [ (<replaceable>n</replaceable>) ]</type></entry>
73        <entry><type>varbit</type></entry>
74        <entry>Suite de bits de longueur variable</entry>
75       </row>
76
77       <row>
78        <entry><type>boolean</type></entry>
79        <entry><type>bool</type></entry>
80        <entry>Booléen (Vrai/Faux)</entry>
81       </row>
82
83       <row>
84        <entry><type>box</type></entry>
85        <entry></entry>
86        <entry>Boîte rectangulaire dans le plan</entry>
87       </row>
88
89       <row>
90        <entry><type>bytea</type></entry>
91        <entry></entry>
92        <entry>Donnée binaire (<quote>tableau d'octets</quote>)</entry>
93       </row>
94
95       <row>
96        <entry><type>character varying [ (<replaceable>n</replaceable>) ]</type></entry>
97        <entry><type>varchar [ (<replaceable>n</replaceable>) ]</type></entry>
98        <entry>Chaîne de caractères de longueur variable</entry>
99       </row>
100
101       <row>
102        <entry><type>character [ (<replaceable>n</replaceable>) ]</type></entry>
103        <entry><type>char [ (<replaceable>n</replaceable>) ]</type></entry>
104        <entry>Chaîne de caractères de longueur fixe</entry>
105       </row>
106
107       <row>
108        <entry><type>cidr</type></entry>
109        <entry></entry>
110        <entry>Adresse réseau IPv4 ou IPv6 </entry>
111       </row>
112
113       <row>
114        <entry><type>circle</type></entry>
115        <entry></entry>
116        <entry>Cercle dans le plan</entry>
117       </row>
118
119       <row>
120        <entry><type>date</type></entry>
121        <entry></entry>
122        <entry>Date du calendrier (année, mois, jour)</entry>
123       </row>
124
125       <row>
126        <entry><type>double precision</type></entry>
127        <entry><type>float8</type></entry>
128        <entry>Nombre à virgule flottante de double précision</entry>
129       </row>
130
131       <row>
132        <entry><type>inet</type></entry>
133        <entry></entry>
134        <entry>Adresse d'ordinateur IPv4 ou IPv6</entry>
135       </row>
136
137       <row>
138        <entry><type>integer</type></entry>
139        <entry><type>int</type>, <type>int4</type></entry>
140        <entry>Entier signé sur 4 octets</entry>
141       </row>
142
143       <row>
144        <entry><type>interval [ (<replaceable>p</replaceable>) ]</type></entry>
145        <entry></entry>
146        <entry>Intervalle de temps</entry>
147       </row>
148
149       <row>
150        <entry><type>line</type></entry>
151        <entry></entry>
152        <entry>Droite (infinie) dans le plan</entry>
153       </row>
154
155       <row>
156        <entry><type>lseg</type></entry>
157        <entry></entry>
158        <entry>Segment de droite dans le plan</entry>
159       </row>
160
161       <row>
162        <entry><type>macaddr</type></entry>
163        <entry></entry>
164        <entry>Adresse MAC</entry>
165       </row>
166
167       <row>
168        <entry><type>money</type></entry>
169        <entry></entry>
170        <entry>Montant monétaire</entry>
171       </row>
172
173       <row>
174        <entry><type>numeric [ (<replaceable>p</replaceable>,
175          <replaceable>s</replaceable>) ]</type></entry>
176        <entry><type>decimal [ (<replaceable>p</replaceable>,
177          <replaceable>s</replaceable>) ]</type></entry>
178        <entry>Nombre exact dont la précision peut être précisée</entry>
179       </row>
180
181       <row>
182        <entry><type>path</type></entry>
183        <entry></entry>
184        <entry>Chemin géométrique dans le plan</entry>
185       </row>
186
187       <row>
188        <entry><type>point</type></entry>
189        <entry></entry>
190        <entry>Point géométrique dans le plan</entry>
191       </row>
192
193       <row>
194        <entry><type>polygon</type></entry>
195        <entry></entry>
196        <entry>Chemin géométrique fermé dans le plan</entry>
197       </row>
198
199       <row>
200        <entry><type>real</type></entry>
201        <entry><type>float4</type></entry>
202        <entry>Nombre à virgule flottante de simple précision</entry>
203       </row>
204
205       <row>
206        <entry><type>smallint</type></entry>
207        <entry><type>int2</type></entry>
208        <entry>Entier signé sur 2 octets</entry>
209       </row>
210
211       <row>
212        <entry><type>serial</type></entry>
213        <entry><type>serial4</type></entry>
214        <entry>Entier sur 4 octets à incrémentation automatique</entry>
215       </row>
216
217       <row>
218        <entry><type>text</type></entry>
219        <entry></entry>
220        <entry>Chaîne de caractères de longueur variable</entry>
221       </row>
222
223       <row>
224        <entry><type>time [ (<replaceable>p</replaceable>) ] [ without time zone ]</type></entry>
225        <entry></entry>
226        <entry>Heure du jour</entry>
227       </row>
228
229       <row>
230        <entry><type>time [ (<replaceable>p</replaceable>) ] with time zone</type></entry>
231        <entry><type>timetz</type></entry>
232        <entry>Heure du jour, avec fuseau horaire</entry>
233       </row>
234
235       <row>
236        <entry><type>timestamp [ (<replaceable>p</replaceable>) ] [ without time zone ]</type></entry>
237        <entry></entry>
238        <entry>Date et heure</entry>
239       </row>
240
241       <row>
242        <entry><type>timestamp [ (<replaceable>p</replaceable>) with time zone</type></entry>
243        <entry><type>timestamptz</type></entry>
244        <entry>Date et heure, avec fuseau horaire</entry>
245       </row>
246
247       <row>
248        <entry><type>tsquery</type></entry>
249        <entry></entry>
250        <entry>requête pour la recherche plein texte</entry>
251       </row>
252
253       <row>
254        <entry><type>tsvector</type></entry>
255        <entry></entry>
256        <entry>document pour la recherche plein texte</entry>
257       </row>
258
259       <row>
260        <entry><type>txid_snapshot</type></entry>
261        <entry></entry>
262        <entry>image de l'identifiant de transaction au niveau utilisateur</entry>
263       </row>
264
265       <row>
266        <entry><type>uuid</type></entry>
267        <entry></entry>
268        <entry>identifiant unique universel</entry>
269       </row>
270
271       <row>
272        <entry><type>xml</type></entry>
273        <entry></entry>
274        <entry>données XML</entry>
275       </row>
276      </tbody>
277     </tgroup>
278    </table>
279
280   <note>
281    <title>Compatibilité</title>
282    <para>
283     Les types suivants sont conformes à la norme <acronym>SQL</acronym>:
284     <type>bigint</type>, <type>bit</type>, <type>bit varying</type>, <type>boolean</type>,
285     <type>char</type>,
286     <type>character varying</type>, <type>character</type>,
287     <type>varchar</type>, <type>date</type>,
288     <type>double precision</type>, <type>integer</type>, <type>interval</type>,
289     <type>numeric</type>, <type>decimal</type>, <type>real</type>,
290     <type>smallint</type>, <type>time</type> (avec et sans fuseau horaire),
291         <type>timestamp</type> (avec et sans fuseau horaire), <type>xml</type>, .
292    </para>
293   </note>
294
295 <!-- invertible = inversable ? -->
296   <para>
297    Chaque type de données a une représentation externe déterminée par
298    ses fonctions d'entrée et de sortie. De nombreux types de données
299    internes ont un format externe évident. Cependant, certains types
300    sont spécifiques à <productname>PostgreSQL</productname>,
301    comme les chemins géométriques, ou acceptent différents formats,
302    comme les types de données de date et d'heure.
303    Certaines fonctions d'entrée et de sortie ne sont pas inversables&nbsp;:
304    le résultat de la fonction de sortie peut manquer de précision
305    comparé à l'entrée initiale.
306   </para>
307
308   <sect1 id="datatype-numeric">
309    <title>Types numériques</title>
310
311    <indexterm zone="datatype-numeric">
312     <primary>Type de données</primary>
313     <secondary>numeric</secondary>
314    </indexterm>
315
316    <para>
317     Les types numériques sont constitués d'entiers de 2, 4 ou 8 octets,
318     de nombres à virgule flottante de 4 ou 8 octets et de décimaux dont
319     la précision peut être indiquée. Le <xref linkend="datatype-numeric-table"/>
320     précise les types disponibles.
321    </para>
322
323     <table id="datatype-numeric-table">
324      <title>Types numériques</title>
325      <tgroup cols="4">
326      <colspec colnum="1" colwidth="0.7*"/>
327      <colspec colnum="2" colwidth="0.7*"/>
328      <colspec colnum="3" colwidth="1.3*"/>
329      <colspec colnum="4" colwidth="1.3*"/>
330       <thead>
331        <row>
332         <entry>Nom</entry>
333         <entry>Taille de stockage</entry>
334         <entry>Description</entry>
335         <entry>Étendue</entry>
336        </row>
337       </thead>
338
339       <tbody>
340        <row>
341         <entry><type>smallint</type></entry>
342         <entry>2 octets</entry>
343         <entry>entier de faible étendue</entry>
344         <entry>de -32768 à +32767</entry>
345        </row>
346        <row>
347        <entry><type>integer</type></entry>
348         <entry>4 octets</entry>
349         <entry>entier habituel</entry>
350         <entry>de -2147483648 à +2147483647</entry>
351        </row>
352        <row>
353         <entry><type>bigint</type></entry>
354         <entry>8 octets</entry>
355         <entry>grand entier</entry>
356         <entry>de -9223372036854775808 à 9223372036854775807</entry>
357        </row>
358
359        <row>
360         <entry><type>decimal</type></entry>
361         <entry>variable</entry>
362         <entry>précision indiquée par l'utilisateur, valeur exacte</entry>
363         <entry>pas de limite</entry>
364        </row>
365        <row>
366         <entry><type>numeric</type></entry>
367         <entry>variable</entry>
368         <entry>précision indiquée par l'utilisateur, valeur exacte</entry>
369         <entry>pas de limite</entry>
370        </row>
371
372        <row>
373         <entry><type>real</type></entry>
374         <entry>4 octets</entry>
375         <entry>précision variable, valeur inexacte</entry>
376         <entry>précision de 6 décimales</entry>
377        </row>
378        <row>
379         <entry><type>double precision</type></entry>
380         <entry>8 octets</entry>
381         <entry>précision variable, valeur inexacte</entry>
382         <entry>précision de 15 décimales</entry>
383        </row>
384
385        <row>
386         <entry><type>serial</type></entry>
387         <entry>4 octets</entry>
388         <entry>entier à incrémentation automatique</entry>
389         <entry>de 1 à 2147483647</entry>
390        </row>
391
392        <row>
393         <entry><type>bigserial</type></entry>
394         <entry>8 octets</entry>
395         <entry>entier de grande taille à incrémentation automatique</entry>
396         <entry>de 1 à 9223372036854775807</entry>
397        </row>
398       </tbody>
399      </tgroup>
400     </table>
401
402    <para>
403     La syntaxe des constantes pour les types numériques est décrite
404     dans la <xref linkend="sql-syntax-constants"/>. Les types numériques
405     ont un ensemble complet d'opérateurs arithmétiques et de fonctions.
406     On peut se référer au <xref linkend="functions"/> pour plus d'informations.
407     Les sections suivantes décrivent ces types en détail.
408    </para>
409
410    <sect2 id="datatype-int">
411     <title>Types entiers</title>
412
413     <indexterm zone="datatype-int">
414      <primary>integer</primary>
415     </indexterm>
416
417     <indexterm zone="datatype-int">
418      <primary>smallint</primary>
419     </indexterm>
420
421     <indexterm zone="datatype-int">
422      <primary>bigint</primary>
423     </indexterm>
424
425     <indexterm>
426      <primary>int4</primary>
427      <see>integer</see>
428     </indexterm>
429
430     <indexterm>
431      <primary>int2</primary>
432      <see>smallint</see>
433     </indexterm>
434
435     <indexterm>
436      <primary>int8</primary>
437      <see>bigint</see>
438     </indexterm>
439
440     <para>
441      Les types <type>smallint</type>, <type>integer</type> et
442      <type>bigint</type> stockent des nombres entiers, c'est-à-dire
443      sans décimale, de différentes étendues.
444      Toute tentative d'y stocker une valeur en dehors de l'échelle
445      produit une erreur.
446     </para>
447
448     <para>
449      Le type <type>integer</type> est le plus courant. Il offre un
450      bon compromis entre capacité, espace utilisé et performance.
451      Le type <type>smallint</type> n'est utilisé que si l'économie
452      d'espace disque est le premier critère de choix.
453      Le type <type>bigint</type> ne doit être utilisé que si le
454      type <type>integer</type> n'offre pas une étendue suffisante
455      car le type <type>integer</type> est nettement plus rapide.
456     </para>
457
458     <para>
459      Le type <type>bigint</type> peut ne pas fonctionner correctement
460      sur toutes les plates-formes, car il repose sur la capacité du
461      compilateur à supporter les entiers de 8 octets.
462      Sur une machine qui ne les supporte pas, <type>bigint</type> se
463      comporte comme <type>integer</type> (mais prend bien huit octets
464      d'espace de stockage). Cela dit, les auteurs n'ont pas connaissance
465      de plate-forme raisonnable sur laquelle il en va ainsi.
466     </para>
467
468     <para>
469      <acronym>SQL</acronym> ne définit que les types de données
470      <type>integer</type> (ou <type>int</type>),
471      <type>smallint</type> et <type>bigint</type>. Les noms
472      de types <type>int2</type>, <type>int4</type>, et
473      <type>int8</type> sont des extensions, partagées par
474      d'autres systèmes de bases de données <acronym>SQL</acronym>.
475     </para>
476
477    </sect2>
478
479    <sect2 id="datatype-numeric-decimal">
480     <title>Nombres à précision arbitraire</title>
481
482     <indexterm>
483      <primary>numeric (data type)</primary>
484     </indexterm>
485
486    <indexterm>
487     <primary>nombres à virgule flottante</primary>
488    </indexterm>
489
490     <indexterm>
491      <primary>decimal</primary>
492      <see>numeric</see>
493     </indexterm>
494
495     <para>
496      Le type <type>numeric</type> peut stocker des nombres contenant
497      jusqu'à 1000 chiffres significatifs et effectuer des calculs
498      exacts. Il est spécialement recommandé pour stocker les montants
499      financiers et autres quantités pour lesquelles l'exactitude est
500      indispensable. Néanmoins, l'arithmétique sur les valeurs
501      <type>numeric</type> est très lente comparée aux types entiers ou aux
502      types à virgule flottante décrits dans la section suivante.
503     </para>
504
505     <para>
506      Dans ce qui suit, on utilise les termes suivants&nbsp;:
507      l'<firstterm>échelle</firstterm> d'un <type>numeric</type> est le
508      nombre de chiffres décimaux de la partie fractionnaire, à droite du
509      séparateur de décimales. La
510      <firstterm>précision</firstterm> d'un <type>numeric</type> est le
511      nombre total de chiffres significatifs dans le nombre complet,
512      c'est-à-dire le nombre de chiffres de part et d'autre du séparateur.
513      Donc, le nombre 23.5141
514      a une précision de 6 et une échelle de 4. On peut considérer que
515      les entiers ont une échelle de 0.
516    </para>
517
518     <para>
519      La précision maximale et l'échelle maximale d'une colonne <type>numeric</type>
520      peuvent être toutes deux réglées.
521      Pour déclarer une colonne de type numérique, il faut utiliser la
522      syntaxe&nbsp;:
523 <programlisting>NUMERIC(<replaceable>précision</replaceable>, <replaceable>échelle</replaceable>)</programlisting>
524      La précision doit être strictement positive, l'échelle positive
525      ou NULL.
526      Alternativement&nbsp;:
527 <programlisting>NUMERIC(<replaceable>précision</replaceable>)</programlisting>
528      indique une échelle de 0.
529 <programlisting>NUMERIC</programlisting>
530      sans précision ni échelle crée une colonne dans laquelle on
531      peut stocker des valeurs de n'importe quelle précision ou
532      échelle, dans la limite de la précision implantée. Une colonne de ce type
533      n'impose aucune précision à la valeur entrée,
534      alors que les colonnes <type>numeric</type> ayant une échelle
535      forcent les valeurs entrées à cette échelle. (Le standard
536      <acronym>SQL</acronym> demande une précision par défaut de 0,
537      c'est-à-dire de forcer la transformation en entiers. Les auteurs
538      trouvent cela inutile. Dans un souci de portabilité,
539      il est préférable de toujours indiquer explicitement la précision et
540      l'échelle.)
541     </para>
542
543     <para>
544      Si l'échelle d'une valeur à stocker est supérieure à celle de la colonne, le
545      système arrondit la valeur au nombre de décimales indiqué pour la colonne.
546      Si le nombre de chiffres à gauche du point
547      décimal est supérieur à la différence entre la précision déclarée et l'échelle
548      déclarée, une erreur est levée.
549     </para>
550
551     <para>
552      Les valeurs numériques sont stockées physiquement sans zéro avant ou
553      après. Du coup, la précision déclarée et l'échelle de la colonne sont
554      des valeurs maximales, pas des allocations fixes (en ce sens, le type
555      numérique est plus proche de <type>varchar(<replaceable>n</replaceable>)</type> que
556      de <type>char(<replaceable>n</replaceable>)</type>). Le besoin pour le
557      stockage réel est de deux octets pour chaque groupe de quatre chiffres
558      décimaux, plus cinq à huit octets d'en-tête.
559     </para>
560
561     <indexterm>
562      <primary>NaN</primary>
563      <see>not a number</see>
564    </indexterm>
565
566     <indexterm>
567      <primary>not a number</primary>
568      <secondary>numeric (type de données)</secondary>
569     </indexterm>
570
571     <para>
572       En plus des valeurs numériques ordinaires, le type <type>numeric</type>
573       autorise la valeur spéciale <literal>NaN</literal> qui signifie   
574       <quote>not-a-number</quote> (NdT&nbsp;: pas un nombre). Toute opération
575       sur <literal>NaN</literal> retourne <literal>NaN</literal>. Pour écrire cette
576       valeur comme une constante dans une requête SQL, elle doit être placée
577       entre guillemets. Par exemple,
578       <literal>UPDATE table SET x = 'NaN'</literal>. En saisie, la chaîne
579       <literal>NaN</literal> est reconnue quelque soit
580       la casse utilisée.
581     </para>
582
583     <note>
584      <para>
585       Dans la plupart des implémentations du concept <quote>not-a-number</quote>,
586       <literal>NaN</literal> est considéré différent de toute valeur numérique
587       (ceci incluant <literal>NaN</literal>). Pour autoriser le tri des valeurs
588       de type <type>numeric</type> et les utiliser dans des index basés sur le
589       tri, <productname>PostgreSQL</productname> traite les valeurs
590       <literal>NaN</literal> comme identiques entre elles, mais toutes supérieures
591       aux valeurs non <literal>NaN</literal>.
592      </para>
593     </note>
594
595     <para>
596      Les types <type>decimal</type> et <type>numeric</type> sont
597      équivalents. Les deux types sont dans le standard
598      <acronym>SQL</acronym>.
599     </para>
600    </sect2>
601
602
603    <sect2 id="datatype-float">
604     <title>Types à virgule flottante</title>
605
606     <indexterm zone="datatype-float">
607      <primary>real</primary>
608     </indexterm>
609
610     <indexterm zone="datatype-float">
611      <primary>double precision</primary>
612     </indexterm>
613
614     <indexterm>
615      <primary>float4</primary>
616      <see>real</see>
617     </indexterm>
618
619     <indexterm>
620      <primary>float8</primary>
621      <see>double precision</see>
622     </indexterm>
623
624     <indexterm zone="datatype-float">
625      <primary>floating point</primary>
626     </indexterm>
627
628     <para>
629      Les types de données <type>real</type> et <type>double
630      precision</type> sont des types numériques inexacts de précision
631      variable. En pratique, ils sont généralement conformes à la norme
632      <acronym>IEEE</acronym> 754 pour l'arithmétique binaire à
633      virgule flottante (respectivement simple et double précision),
634      dans la mesure où les processeurs, le système d'exploitation et
635      le compilateur les supportent.
636     </para>
637
638     <para>
639      Inexact signifie que certaines valeurs ne peuvent être converties
640      exactement dans le format interne. Elles sont, de ce fait, stockées sous
641      une forme approchée. Ainsi, stocker puis réafficher ces valeurs
642      peut faire apparaître de légers écarts.
643      Prendre en compte ces erreurs et la façon dont elles se propagent
644      au cours des calculs est le sujet d'une branche entière des
645      mathématiques et de l'informatique, qui n'est pas le sujet de ce
646      document, à l'exception des points suivants&nbsp;:
647      <itemizedlist>
648       <listitem>
649        <para>
650         pour un stockage et des calculs exacts, comme
651         pour les valeurs monétaires, le type <type>numeric</type> doit être
652         privilégié&nbsp;;
653       </para>
654       </listitem>
655
656       <listitem>
657        <para>
658         pour des calculs compliqués avec ces types
659         pour quoi que ce soit d'important, et particulièrement pour
660         le comportement aux limites (infini, zéro), l'implantation spécifique
661         à la plate-forme doit être étudié avec soin&nbsp;;
662        </para>
663       </listitem>
664
665       <listitem>
666        <para>
667         tester l'égalité de deux valeurs à virgule flottante peut ne
668         pas donner le résultat attendu.
669        </para>
670       </listitem>
671      </itemizedlist>
672     </para>
673
674     <para>
675      Sur la plupart des plates-formes, le type <type>real</type> a une
676      étendue d'au moins 1E-37 à 1E37 avec une précision d'au moins
677      6 chiffres décimaux. Le type <type>double precision</type> a
678      généralement une étendue de 1E-307 à 1E+308 avec une précision
679      d'au moins 15 chiffres. Les valeurs trop grandes ou trop petites
680      produisent une erreur. Un arrondi peut avoir lieu si la précision
681      d'un nombre en entrée est trop grande. Les nombres trop proches
682      de zéro qui ne peuvent être représentés autrement que par zéro
683      produisent une erreur (underflow).
684     </para>
685
686     <indexterm>
687      <primary>not a number</primary>
688      <secondary>double precision</secondary>
689     </indexterm>
690
691     <para>
692      En plus des valeurs numériques ordinaires, les types à virgule flottante
693      ont plusieurs valeurs spéciales&nbsp;:
694 <literallayout><literal>Infinity</literal>
695 <literal>-Infinity</literal>
696 <literal>NaN</literal></literallayout>
697      Elles représentent les valeurs spéciales de l'IEEE 754,
698      respectivement <quote>infinity</quote> (NdT&nbsp;: infini),
699      <quote>negative infinity</quote> (NdT&nbsp;: infini négatif) et
700      <quote>not-a-number</quote> (NdT&nbsp;: pas un nombre) (sur une machine
701      dont l'arithmétique à virgule flottante ne suit pas l'IEEE 754, ces
702      valeurs ne fonctionnent probablement pas comme espéré). Lorsqu'elles
703      sont saisies en tant que constantes dans une commande SQL, ces valeurs
704      doivent être placées entre guillemets. Par exemple, <literal>UPDATE
705      table SET x = 'Infinity'</literal>. En entrée, ces valeurs sont reconnues
706      quelque soit la casse utilisée.
707     </para>
708
709     <note>
710      <para>
711       IEEE754 spécifie que <literal>NaN</literal> ne devrait pas être considéré
712       égale à toute autre valeur en virgule flottante (ceci incluant
713       <literal>NaN</literal>). Pour permettre le tri des valeurs en virgule
714       flottante et leur utilisation dans des index basés sur des arbres,
715       <productname>PostgreSQL</productname> traite les valeurs
716       <literal>NaN</literal> comme identiques entre elles, mais supérieures
717       à toute valeur différente de <literal>NaN</literal>.
718      </para>
719     </note>
720
721     <para>
722      <productname>PostgreSQL</productname> autorise aussi la notation
723      <type>float</type> du standard SQL, ainsi que
724      <type>float(<replaceable>p</replaceable>)</type> pour indiquer
725      des types numériques inexacts. <replaceable>p</replaceable>
726      indique la précision minimale acceptable en chiffres binaires.
727      <productname>PostgreSQL</productname> accepte de
728      <type>float(1)</type> à <type>float(24)</type>, qu'il transforme en
729      type <type>real</type>, et de
730      <type>float(25)</type> à <type>float(53)</type>, qu'il transforme en
731      type <type>double precision</type>. Toute valeur de
732      <replaceable>p</replaceable> hors de la zone des valeurs possibles
733      produit une erreur. <type>float</type> sans précision est compris
734      comme <type>double precision</type>.
735     </para>
736
737     <note>
738      <para>
739       Avant <productname>PostgreSQL</productname> 7.4, la précision
740       d'un <type>float(<replaceable>p</replaceable>)</type> était
741       supposée indiquer une précision en chiffres décimaux.
742       Cela a été corrigé pour respecter le standard SQL, qui
743       indique que la précision est indiquée en chiffres binaires.
744       L'affirmation que les <type>real</type> et les
745       <type>double precision</type> ont exactement 24 et 53 bits
746       dans la mantisse est correcte pour les implémentations des
747       nombres à virgule flottante respectant le standard IEEE.
748       Sur les plates-formes non-IEEE, c'est peut-être un peu sous-estimé
749       mais, pour plus de simplicité, la gamme de valeurs pour
750       <replaceable>p</replaceable> est utilisée sur toutes les
751       plates-formes.
752      </para>
753     </note>
754
755    </sect2>
756
757    <sect2 id="datatype-serial">
758     <title>Types seriés</title>
759
760     <indexterm zone="datatype-serial">
761      <primary>serial</primary>
762     </indexterm>
763
764     <indexterm zone="datatype-serial">
765      <primary>bigserial</primary>
766     </indexterm>
767
768     <indexterm zone="datatype-serial">
769      <primary>serial4</primary>
770     </indexterm>
771
772     <indexterm zone="datatype-serial">
773      <primary>serial8</primary>
774     </indexterm>
775
776     <indexterm>
777      <primary>auto-increment</primary>
778      <see>serial</see>
779     </indexterm>
780
781     <indexterm>
782      <primary>séquence</primary>
783      <secondary>type serial</secondary>
784     </indexterm>
785
786     <para>
787      Les types de données <type>serial</type> et <type>bigserial</type>
788      ne sont pas de vrais types, mais plutôt un raccourci de notation
789      pour créer des colonnes d'identifiants uniques (similaires à la
790      propriété <literal>AUTO_INCREMENT</literal> utilisée par d'autres
791      SGBD). Dans la version actuelle, indiquer&nbsp;:
792
793 <programlisting>CREATE TABLE <replaceable class="parameter">nom_de_table</replaceable> (
794     <replaceable class="parameter">nom_de_colonne</replaceable> SERIAL
795 );</programlisting>
796
797      est équivalent à écrire :
798
799 <programlisting>CREATE SEQUENCE <replaceable class="parameter">nom_de_table</replaceable>_<replaceable class="parameter">nom_de_colonne</replaceable>_seq;
800 CREATE TABLE <replaceable class="parameter">nom_de_table</replaceable> (
801     <replaceable class="parameter">nom_de_colonne</replaceable> integer NOT NULL DEFAULT nextval('<replaceable class="parameter">nom_de_table</replaceable>_<replaceable class="parameter">nom_de_colonne</replaceable>_seq') NOT NULL
802 );
803 ALTER SEQUENCE <replaceable class="parameter">nom_de_table</replaceable>_<replaceable class="parameter">nom_de_colonne</replaceable>_seq OWNED BY <replaceable class="parameter">nom_de_table</replaceable>.<replaceable class="parameter">nom_de_colonne</replaceable>;</programlisting>
804
805      Une colonne d'entiers a ainsi été créée dont la valeur par défaut
806      est assignée par un générateur de
807      séquence. Une contrainte <literal>NOT NULL</literal> est ajoutée pour
808      s'assurer qu'une valeur NULL ne puisse pas être explicitement
809      insérée. (Dans la plupart des cas, une
810      contrainte <literal>UNIQUE</literal> ou <literal>PRIMARY KEY</literal>
811      peut être ajoutée pour
812      interdire que des doublons soient créés par accident, mais ce
813      n'est pas automatique.) Enfin, la séquence est marquée <quote>owned by</quote>
814      (possédée par) la colonne pour qu'elle soit supprimée si la colonne ou
815      la table est supprimée.
816     </para>
817
818     <note>
819      <para>
820       Avant <productname>PostgreSQL</productname> 7.3,
821       <type>serial</type> sous-entendait <literal>UNIQUE</literal>.
822       Ce n'est plus automatique. Pour qu'une colonne de type
823       serial soit unique ou soit une clé primaire, il faut le préciser,
824       comme pour les autres types.
825      </para>
826     </note>
827
828     <para>
829      Pour insérer la valeur suivante de la séquence dans la colonne
830      <type>serial</type>, il faut préciser que la valeur par
831      défaut de la colonne doit être utilisée. Cela peut se faire de deux façons&nbsp;: soit en
832      excluant cette colonne de la liste des colonnes de la commande
833      <command>INSERT</command> soit en utilisant le mot clé
834      <literal>DEFAULT</literal>.
835     </para>
836
837     <para>
838      Les types <type>serial</type> et <type>serial4</type> sont
839      identiques&nbsp;: ils créent tous les deux des colonnes
840      <type>integer</type>. Les types <type>bigserial</type> et
841      <type>serial8</type> fonctionnent de la même façon mais créent des
842      colonnes <type>bigint</type>. <type>bigserial</type> doit
843      être utilisé si plus de 2<superscript>31</superscript>
844      identifiants sont prévus sur la durée de vie de la table.
845     </para>
846
847     <para>
848      La séquence créée pour une colonne <type>serial</type> est automatiquement
849      supprimée quand la colonne correspondante est supprimée. La séquence peut
850      être détruite sans supprimer la colonne, mais
851      la valeur par défaut de la colonne est alors également supprimée.
852     </para>
853    </sect2>
854   </sect1>
855
856   <sect1 id="datatype-money">
857    <title>Types monétaires</title>
858
859    <para>
860     Le type <type>money</type> stocke un montant en devise avec
861     un nombre fixe de décimales. Voir le <xref linkend="datatype-money-table"/>.
862     De nombreux formats sont acceptés en entrée, dont les entiers et
863     les nombre à virgule flottante, ainsi que les formats classiques
864     de devises, comme <literal>'$1,000.00'</literal>.
865     Le format de sortie est généralement dans le dernier format, mais dépend
866     de la locale.
867     Les valeurs numériques qui ne sont pas entre guillemets peuvent être
868     converties dans le type <type>money</type> en convertissant la valeur
869     numérique en <type>text</type> puis en <type>money</type>&nbsp;:
870 <programlisting>
871 SELECT 1234::text::money;
872 </programlisting>
873     Il n'existe pas de moyen simple de faire l'inverse d'une façon
874     indépendante de la locale, donc en convertissant une valeur de type
875     <type>money</type> en un type numérique.
876     Si vous connaissez le symbole de la monnaie et le séparateur des
877     milliers, vous pouvez utiliser <function>regexp_replace()</function>&nbsp;:
878 <programlisting>
879 SELECT regexp_replace('52093.89'::money::text, '[$,]', '', 'g')::numeric;
880 </programlisting>
881
882    </para>
883
884    <para>
885     Comme l'affichage de ce type de données est sensible à la casse, charger
886     des données du type  <type>money</type> dans une base de données qui a une
887     configuration différente de <varname>lc_monetary</varname> pourrait ne pas
888     fonctionner. Pour éviter les problèmes, assurez-vous, avant de restaurer une
889     sauvegarde, que la variable <varname>lc_monetary</varname> a la même valeur
890     ou une valeur équivalente à celle qui était configurée lors de la
891     sauvegarde.
892    </para>
893
894     <table id="datatype-money-table">
895      <title>Types monétaires</title>
896      <tgroup cols="4">
897      <colspec colnum="1" colwidth="0.7*"/>
898      <colspec colnum="2" colwidth="0.7*"/>
899      <colspec colnum="3" colwidth="1.3*"/>
900      <colspec colnum="4" colwidth="1.3*"/>
901       <thead>
902        <row>
903         <entry>Nom</entry>
904         <entry>Taille de stockage</entry>
905         <entry>Description</entry>
906         <entry>Étendue</entry>
907        </row>
908       </thead>
909       <tbody>
910        <row>
911         <entry>money</entry>
912         <entry>8 octets</entry>
913         <entry>montant monétaire</entry>
914         <entry>-92233720368547758.08 à +92233720368547758.07</entry>
915        </row>
916       </tbody>
917      </tgroup>
918     </table>
919   </sect1>
920
921
922   <sect1 id="datatype-character">
923    <title>Types caractère</title>
924
925    <indexterm zone="datatype-character">
926     <primary>Chaîne de caractères</primary>
927     <secondary>types de données</secondary>
928    </indexterm>
929
930    <indexterm>
931     <primary>Chaîne</primary>
932     <see>Chaîne de caractères</see>
933    </indexterm>
934
935    <indexterm zone="datatype-character">
936     <primary>character</primary>
937    </indexterm>
938
939    <indexterm zone="datatype-character">
940     <primary>character varying</primary>
941    </indexterm>
942
943    <indexterm zone="datatype-character">
944     <primary>text</primary>
945    </indexterm>
946
947    <indexterm zone="datatype-character">
948     <primary>char</primary>
949    </indexterm>
950
951    <indexterm zone="datatype-character">
952     <primary>varchar</primary>
953    </indexterm>
954
955     <table id="datatype-character-table">
956      <title>Types caractère</title>
957      <tgroup cols="2">
958       <thead>
959        <row>
960         <entry>Nom</entry>
961         <entry>Description</entry>
962        </row>
963       </thead>
964       <tbody>
965        <row>
966         <entry><type>character varying(<replaceable>n</replaceable>)</type>, <type>varchar(<replaceable>n</replaceable>)</type></entry>
967         <entry>Longueur variable avec limite</entry>
968        </row>
969        <row>
970         <entry><type>character(<replaceable>n</replaceable>)</type>, <type>char(<replaceable>n</replaceable>)</type></entry>
971         <entry>longueur fixe, complété par des espaces</entry>
972        </row>
973        <row>
974         <entry><type>text</type></entry>
975         <entry>longueur variable illimitée</entry>
976        </row>
977      </tbody>
978      </tgroup>
979     </table>
980
981    <para>
982     Le <xref linkend="datatype-character-table"/> présente les types
983     génériques disponibles dans <productname>PostgreSQL</productname>.
984    </para>
985
986    <para>
987     <acronym>SQL</acronym> définit deux types de caractères principaux&nbsp;:
988     <type>character varying(<replaceable>n</replaceable>)</type> et
989     <type>character(<replaceable>n</replaceable>)</type> où <replaceable>n</replaceable>
990     est un entier positif.
991     Ces deux types permettent de stocker des chaînes de caractères de taille
992     inférieure ou égale à <replaceable>n</replaceable>. Toute tentative
993     d'insértion d'une chaîne plus longue conduit à une erreur, à moins que les
994     caractères en excès ne soient tous des espaces, auquel cas la chaîne
995     est tronquée à la taille maximale (cette exception étrange est imposée
996     par la norme <acronym>SQL</acronym>).
997     Si la chaîne à stocker est plus petite que la taille déclarée,
998     les valeurs de type <type>character</type> sont complétées par des
999     espaces, celles de type <type>character varying</type> sont stockées en
1000     l'état.
1001    </para>
1002
1003     <para>
1004      Si une valeur est explicitement transtypée en 
1005      <type>character varying(<replaceable>n</replaceable>)</type> ou en
1006      <type>character(<replaceable>n</replaceable>)</type>, une valeur trop
1007      longue est tronquée à <replaceable>n</replaceable> caractères sans
1008      qu'aucune erreur ne soit levée (ce comportement est aussi imposé par
1009      la norme <acronym>SQL</acronym>.)
1010     </para>
1011
1012    <para>
1013     Les notations <type>varchar(<replaceable>n</replaceable>)</type> et
1014     <type>char(<replaceable>n</replaceable>)</type> sont des alias de
1015     <type>character varying(<replaceable>n</replaceable>)</type> et
1016     <type>character(<replaceable>n</replaceable>)</type>, respectivement.
1017     <type>character</type> sans indication de taille est équivalent à
1018     <type>character(1)</type>. Si <type>character varying</type> est
1019     utilisé sans indicateur de taille, le type accepte des chaînes de
1020     toute taille. Il s'agit là d'une spécificité de
1021     <productname>PostgreSQL</productname>.
1022    </para>
1023
1024    <para>
1025     De plus, <productname>PostgreSQL</productname> propose aussi le type
1026     <type>text</type>, qui permet de stocker des chaînes de n'importe
1027     quelle taille. Bien que le type <type>text</type> ne soit pas
1028     dans le standard <acronym>SQL</acronym>, plusieurs autres systèmes de
1029     gestion de bases de données SQL le proposent également.
1030    </para>
1031
1032 <!-- padded : complété, aligné, autre chose ? padding : remplissage -->
1033 <!-- trailing spaces : espaces finales -->
1034    <para>
1035     Les valeurs de type <type>character</type> sont complétées physiquement à
1036     l'aide d'espaces pour atteindre la longueur <replaceable>n</replaceable>
1037     indiquée. Ces valeurs sont également
1038     stockées et affichées de cette façon. Les espaces de remplissage
1039     n'ont, toutefois, aucune signification sémantique. Les espaces finales
1040     sont ignorées lors de la comparaison de deux valeurs de type
1041     <type>character</type> et sont supprimées lors de la conversion
1042     d'une valeur <type>character</type> en un des autres types chaîne. Ces
1043     espaces <emphasis>ont</emphasis> une signification sémantique pour
1044     les valeurs de type <type>character varying</type> et <type>text</type>.
1045    </para>
1046
1047    <para>
1048     L'espace nécessaire pour une chaîne de caractères courte (jusqu'à 126 octets)
1049     est de un octet, plus la taille de la chaîne qui inclut le remplissage avec
1050     des espaces dans le cas du type <type>character</type>. Les chaînes plus
1051     longues ont quatre octets d'en-tête au lieu d'un seul. Les chaînes longues
1052     sont automatiquement compressées par le système, donc le besoin pourrait
1053     être moindre. Les chaînes vraiment très longues sont stockées dans des
1054     tables supplémentaires, pour qu'elles n'empêchent pas d'accéder rapidement
1055     à des valeurs plus courtes.
1056     Dans tous les cas, la taille maximale possible pour une chaîne de