root/traduc/branches/bv803/manuel/datatype.sgml

Revision 869, 119.4 kB (checked in by gleu, 1 year ago)

Mise à jour pour la version 8.0.15.

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