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

Revision 870, 116.3 kB (checked in by gleu, 11 months ago)

Mise à jour pour la version 7.4.19.

Line 
1 <!--
2 $Header: /var/lib/cvs/pgsql-fr/sgml/datatype.sgml,v 1.7.2.2 2005/07/15 06:33:36 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</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(<replaceable>n</replaceable>)</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> Boite rectangulaire dans le plan</entry>
82       </row>
83
84       <row>
85        <entry><type>bytea</type></entry>
86        <entry></entry>
87        <entry>Donnée binaire</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>Interval de temps</entry>
142       </row>
143
144       <row>
145        <entry><type>line</type></entry>
146        <entry></entry>
147        <entry>Ligne infinie dans le plan (partiellement disponible)</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 ouvert et fermé 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><type>timestamp</type></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 ouverts et fermés, 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   <para>
273    Certains des opérateurs et des fonctions (comme l'addition et la
274    multiplication) n'effectuent pas de vérification d'erreur à
275    l'exécution, pour améliorer la vitesse d'exécution.
276    Dans certains systèmes, pour certains types de données, les
277    opérateurs numériques peuvent causer des dépassements de précision
278    sans afficher erreur.
279   </para>
280
281   <sect1 id="datatype-numeric">
282    <title>Types numériques</title>
283
284    <indexterm zone="datatype-numeric">
285     <primary>Type de données</primary>
286     <secondary>numeric</secondary>
287    </indexterm>
288
289    <para>
290     Les types numériques sont constitués d'entiers de 2, 4 ou 8 octets,
291     de nombre à virgule flottante de 4 ou 8 octets, et de décimaux à
292     précision fixe.
293 </para>
294
295     <table id="datatype-numeric-table">
296      <title>Types numériques</title>
297      <tgroup cols="4">
298       <thead>
299        <row>
300         <entry>Nom</entry>
301         <entry>Taille de stockage</entry>
302         <entry>Description</entry>
303         <entry>Étendue</entry>
304        </row>
305       </thead>
306
307       <tbody>
308        <row>
309         <entry><type>smallint</></entry>
310         <entry>2 octets</entry>
311         <entry>entier de faible étendue</entry>
312         <entry>-32768 à +32767</entry>
313        </row>
314        <row>
315        <entry><type>integer</></entry>
316         <entry>4 octets</entry>
317         <entry>entiers les plus courants</entry>
318         <entry>-2147483648 à +2147483647</entry>
319        </row>
320        <row>
321         <entry><type>bigint</></entry>
322         <entry>8 octets</entry>
323         <entry>grands entiers</entry>
324         <entry>-9223372036854775808 à 9223372036854775807</entry>
325        </row>
326
327        <row>
328         <entry><type>decimal</></entry>
329         <entry>variable</entry>
330         <entry>Précision indiquée par l'utilisateur. Valeurs exactes</entry>
331         <entry>pas de limite</entry>
332        </row>
333        <row>
334         <entry><type>numeric</></entry>
335         <entry>variable</entry>
336         <entry>Précision indiquée par l'utilisateur. Valeurs exactes</entry>
337         <entry>pas de limite</entry>
338        </row>
339
340        <row>
341         <entry><type>real</></entry>
342         <entry>4 octets</entry>
343         <entry>Précision variable. Valeurs inexactes</entry>
344         <entry>précision de 6 décimales</entry>
345        </row>
346        <row>
347         <entry><type>double precision</></entry>
348         <entry>8 octets</entry>
349         <entry>Précision variable. Valeurs inexactes</entry>
350         <entry>précision de 15 décimales</entry>
351        </row>
352
353        <row>
354         <entry><type>serial</></entry>
355         <entry>4 octets</entry>
356         <entry>entier à incrémentation automatique</entry>
357         <entry>1 à 2147483647</entry>
358        </row>
359
360        <row>
361         <entry><type>bigserial</type></entry>
362         <entry>8 octets</entry>
363         <entry>entier de grande taille à incrémentation automatique</entry>
364         <entry>1 à 9223372036854775807</entry>
365        </row>
366       </tbody>
367      </tgroup>
368     </table>
369
370    <para>
371     La syntaxe des constantes pour les types numériques est décrite
372     dans <xref linkend="sql-syntax-constants">. Les types numériques
373     ont un ensemble complet d'opérateurs arithmétiques et de fonctions.
374     Référez vous à <xref linkend="functions"> pour plus d'informations.
375     Les sections suivantes décrivent ces types en détail.
376    </para>
377
378    <sect2 id="datatype-int">
379     <title>Types entiers</title>
380
381     <indexterm zone="datatype-int">
382      <primary>integer</primary>
383     </indexterm>
384
385     <indexterm zone="datatype-int">
386      <primary>smallint</primary>
387     </indexterm>
388
389     <indexterm zone="datatype-int">
390      <primary>bigint</primary>
391     </indexterm>
392
393     <indexterm>
394      <primary>int4</primary>
395      <see>integer</see>
396     </indexterm>
397
398     <indexterm>
399      <primary>int2</primary>
400      <see>smallint</see>
401     </indexterm>
402
403     <indexterm>
404      <primary>int8</primary>
405      <see>bigint</see>
406     </indexterm>
407
408     <para>
409      Les types <type>smallint</type>, <type>integer</type>, et
410      <type>bigint</type> stockent des nombres entiers, c'est à dire
411      sans décimale, de différentes étendues.
412      Toute tentative d'y stocker une valeur trop grande ou trop petite
413      produite une erreur.
414     </para>
415
416     <para>
417      Le type <type>integer</type> est le plus courant. Il offre un
418      bon compromis entre capacité, espace utilisé et performances.
419      Le type <type>smallint</type> n'est utilisé que si l'économie
420      d'espace disque est le premier critère de choix.
421      Le type <type>bigint</type> ne doit être utilisé que si le
422      type <type>integer</type> n'offre pas une étendue suffisante,
423      car le type <type>integer</type> est nettement plus rapide.
424     </para>
425
426     <para>
427      Le type <type>bigint</type> peut ne pas fonctionner correctement
428      sur toutes les plates-formes, car il repose sur la capacité du
429      compilateur à supporter les entiers de 8 octets.
430      Sur une machine qui ne les supporte pas, <type>bigint</type> se
431      comporte comme <type>integer</type> (mais prend bien huit octets
432      d'espace de stockage). Ceci dit, nous ne connaissons pas de
433      plate-forme raisonnable sur laquelle il en va ainsi.
434     </para>
435
436     <para>
437      <acronym>SQL</acronym> ne spécifie que les types de données
438      <type>integer</type> (ou <type>int</type>) et
439      <type>smallint</type>.  Le type <type>bigint</type>, et les noms
440      de types <type>int2</type>, <type>int4</type>, et
441      <type>int8</type> sont des extensions, qui sont partagées avec
442      d'autres systèmes de bases de données <acronym>SQL</acronym>.
443     </para>
444
445     <note>
446      <para>
447       Si vous avez une colonne de type <type>smallint</type> ou
448       <type>bigint</type> avec un index, vous pourrez rencontrer des
449       problèmes pour que le système utilise cet index. Par exemple,
450       une clause de la forme
451 <programlisting>
452 ... WHERE smallint_column = 42
453 </programlisting>
454       n'utilisera pas l'index, parce que le système assigne le type
455       <type>integer</type> à la constante 42, et
456       <productname>PostgreSQL</productname> ne sait pour l'instant
457       pas utiliser un index lorsque deux types de données différents
458       sont utilisés. Un contournement est d'entourer la constante
459       entre apostrophes, comme:
460 <programlisting>
461 ... WHERE smallint_column = '42'
462 </programlisting>
463       Cela forcera le système à retarder la résolution de type, ce
464       qui permettra d'assigner le bon type à la constante.
465      </para>
466     </note>
467
468    </sect2>
469
470    <sect2 id="datatype-numeric-decimal">
471     <title>Nombre à précision arbitraire</title>
472
473     <indexterm zone="datatype-numeric-decimal">
474      <primary>numeric (data type)</primary>
475     </indexterm>
476
477     <indexterm>
478      <primary>decimal</primary>
479      <see>numeric</see>
480     </indexterm>
481
482     <para>
483      Le type <type>numeric</type> peut stocker des nombres avec
484      jusqu'à 1000 chiffres significatifs et effectuer des calculs
485      exacts. Il est spécialement recommander pour stocker les montants
486      financiers et autres quantités pour lesquelles l'exactitude est
487      indispensable. Néanmoins, le type <type>numeric</type> est très
488      lent comparé aux types à virgule flottante décrits dans la
489      section suivante.
490     </para>
491
492     <para>
493      Dans ce qui suit, on utilise les termes suivants:
494      L'<firstterm>échelle</firstterm> d'un <type>numeric</type> est le
495      nombre de chiffres décimaux de la partie fractionnaire. La
496      <firstterm>précision</firstterm> d'un <type>numeric</type> est le
497      nombre total de chiffres significatifs dans le nombre entier,
498      c'est à dire avant et après la virgule. Donc, le nombre 23,5141
499      a une précision de 6 et une échelle de 4. On peut considérer que
500      les entiers ont une échelle de 0.
501    </para>
502
503     <para>
504      La précision et l'échelle d'un numérique peuvent être réglés.
505      Pour déclarer une colonne de type numérique, il faut utiliser la
506      syntaxe.
507 <programlisting>
508 NUMERIC(<replaceable>précision</replaceable>, <replaceable>échelle</replaceable>)
509 </programlisting>
510      La précision pour être strictement positive, l'échelle positive
511      ou nulle.
512      Alternativement,
513 <programlisting>
514 NUMERIC(<replaceable>précision</replaceable>)
515 </programlisting>
516      indique une échelle de 0.  Préciser
517 <programlisting>
518 NUMERIC
519 </programlisting>
520      sans précision ni échelle crée une colonne dans laquelle on
521      peut stocker des valeurs de n'importe quelle précision ou
522      échelle, jusqu'à la limite de précision. Une colonne de ce type
523      ne forcera aucune valeur entrée à une précision particulière,
524      alors que les colonnes <type>numeric</type> avec une échelle
525      forcent les valeurs entrées à cette échelle. (Le standard
526      <acronym>SQL</acronym> demande une précision par défaut de 0,
527      c'est à dire de forcer la transformation en entiers. Nous
528      trouvons ça inutile. Si vous êtes soucieux de portabilité,
529      précisez toujours la précision et l'échelle explicitement.)
530     </para>
531
532     <para>
533      Si la précision ou l'échelle d'une valeur sont supérieures à la
534      précision ou à l'échelle d'une colonne, le système tentera
535      d'arrondir la valeur. Si la valeur ne peut être arrondie d'une
536      manière qui corresponde aux limites déclarées, alors une erreur
537      est produite.
538     </para>
539
540     <para>
541      Les types <type>decimal</type> et <type>numeric</type> sont
542      équivalents. Les deux types sont dans le standard
543      <acronym>SQL</acronym>.
544     </para>
545    </sect2>
546
547
548    <sect2 id="datatype-float">
549     <title>Types à virgule flottante</title>
550
551     <indexterm zone="datatype-float">
552      <primary>real</primary>
553     </indexterm>
554
555     <indexterm zone="datatype-float">
556      <primary>double precision</primary>
557     </indexterm>
558
559     <indexterm>
560      <primary>float4</primary>
561      <see>real</see>
562     </indexterm>
563
564     <indexterm>
565      <primary>float8</primary>
566      <see>double precision</see>
567     </indexterm>
568
569     <indexterm zone="datatype-float">
570      <primary>floating point</primary>
571     </indexterm>
572
573     <para>
574      Les types de données <type>real</type> et <type>double
575      precision</type> sont des types numériques à précision variable
576      inexacts. En pratique, ils sont généralement conformes à la norme
577      <acronym>IEEE</acronym> 754 pour l'arithmétique binaire à
578      virgule flottante (respectivement simple et double précision),
579      dans la mesure où les processeurs, le système d'exploitation et
580      le compilateur les supportent.
581     </para>
582
583     <para>
584      Inexact signifie que certaines valeurs ne peuvent être converties
585      exactement dans le format interne, et sont stockées sous forme
586      d'approximations, si bien que stocker puis réafficher ces valeurs
587      peut faire apparaître de légers écarts.
588      Prendre en compte ces erreurs et la façon dont elles se propagent
589      au cours des calculs est le sujet d'une branche entière des
590      mathématiques et de l'informatique. Nous n'en dirons pas plus que
591      ce qui suit:
592      <itemizedlist>
593       <listitem>
594        <para>
595         Si vous avez besoin d'un stockage et de calculs exacts, comme
596         pour les valeurs monétaires, utilisez plutôt le type
597         <type>numeric</type>.
598       </para>
599       </listitem>
600
601       <listitem>
602        <para>
603         Si vous voulez faire des calculs compliqués avec ces types
604         pour quoi que ce soit d'important, et particulièrement si
605         vous comptez sur certains comportements aux limites (infinis,
606         zéro), alors vous devriez étudier le comportement de votre
607         plate-forme avec soin.
608        </para>
609       </listitem>
610
611       <listitem>
612        <para>
613         Tester l'égalité de deux valeurs à virgule flottante peux ne
614         pas donner le résultat attendu.
615        </para>
616       </listitem>
617      </itemizedlist>
618     </para>
619
620     <para>
621      Sur la plupart des plates-formes, le type <type>real</type> a une
622      étendue d'au moins 1E-37 à 1E37 avec une précision d'au moins
623      6 chiffres décimaux. Le type <type>double precision</type> a
624      généralement une étendue de 1E-307 à 1E+308 avec une précision
625      d'au moins 15 chiffres. Les valeurs trop grandes ou trop petites
626      produisent une erreur. Un arrondi peut avoir lieu si la précision
627      d'un nombre en entrée est trop grande. Les nombres trop proches
628      de zéro qui ne peuvent être représentés autrement que par zéro
629      produisent une erreur (underflow).
630     </para>
631
632     <para>
633      <productname>PostgreSQL</productname> autorise aussi la notation
634      <type>float</type> du standard SQL, ainsi que
635      <type>float(<replaceable>p</replaceable>)</type> pour indiquer
636      des types numériques inexacts. Ici, <replaceable>p</replaceable>
637      indique la précision minimale acceptable en chiffres binaires.
638      <productname>PostgreSQL</productname> accepte
639      <type>float(1)</type> à <type>float(24)</type>, transformés en
640      type <type>real</type> et
641      <type>float(25)</type> to <type>float(53)</type>, transformés en
642      type <type>double precision</type>. Toute valeur de
643      <replaceable>p</replaceable> hors de la zone de valeurs possible
644      produit une erreur. <type>float</type> sans précision est compris
645      comme <type>double precision</type>.
646     </para>
647
648     <note>
649      <para>
650       Avant <productname>PostgreSQL</productname> 7.4, la précision
651       d'un <type>float(<replaceable>p</replaceable>)</type> était
652       supposée indiquer une précision en chiffres décimaux.
653       Nous l'avons corrigée pour respecter le standard SQL, qui
654       indique que la précision est indiquée en chiffres binaires.
655       L'affirmation que les <type>real</type> et les
656       <type>double precision</type> ont exactement 24 et 53 bits
657       dans la mantisse est correcte pour les implémentations des
658       nombres à virgule flottante respectant le standard IEEE.
659       Sur les plates-formes non-IEEE, c'est peut-être un peu sous-estimé,
660       mais pour plus de simplicité, la gamme de valeurs pour
661       <replaceable>p</replaceable> est utilisée sur toutes les
662       plates-formes.
663      </para>
664     </note>
665
666    </sect2>
667
668    <sect2 id="datatype-serial">
669     <title>Types Série</title>
670
671     <indexterm zone="datatype-serial">
672      <primary>serial</primary>
673     </indexterm>
674
675     <indexterm zone="datatype-serial">
676      <primary>bigserial</primary>
677     </indexterm>
678
679     <indexterm zone="datatype-serial">
680      <primary>serial4</primary>
681     </indexterm>
682
683     <indexterm zone="datatype-serial">
684      <primary>serial8</primary>
685     </indexterm>
686
687     <indexterm>
688      <primary>auto-increment</primary>
689      <see>serial</see>
690     </indexterm>
691
692     <indexterm>
693      <primary>séquence</primary>
694      <secondary>type serial</secondary>
695     </indexterm>
696
697     <para>
698      Les types de données <type>serial</type> et <type>bigserial</type>
699      ne sont pas de vrais types, mais plutôt un raccourci de notation
700      pour décrire des colonnes d'identifiants uniques (similaires à la
701      propriété <literal>AUTO_INCREMENT</literal> utilisée par d'autres
702      SGBD). Dans la version actuelle, indiquer
703
704 <programlisting>
705 CREATE TABLE <replaceable class="parameter">nom_de_table</replaceable> (
706     <replaceable class="parameter">nom_de_colonne</replaceable> SERIAL
707 );
708 </programlisting>
709
710      est équivalent à écrire :
711
712 <programlisting>
713 CREATE SEQUENCE <replaceable class="parameter">nom_de_table</replaceable>_<replaceable class="parameter">colname</replaceable>_seq;
714 CREATE TABLE <replaceable class="parameter">nom_de_table</replaceable> (
715     <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
716 );
717 </programlisting>
718
719      Ainsi, nous avons créé une colonne d'entiers et fait en sorte
720      que ses valeurs par défaut soient assignées par un générateur de
721      séquence. Une contrainte <literal>NOT NULL</literal> est ajoutée pour
722      s'assurer qu'une valeur Nulle ne puisse pas être explicitement
723      insérée. Dans la plupart des cas, vous voudrez aussi ajouter une
724      contrainte <literal>UNIQUE</literal> ou <literal>PRIMARY KEY</literal> pour
725      interdire que des doublons soient créés par accident, mais ce
726      n'est pas automatique.
727     </para>
728
729     <note>
730      <para>
731       Avant <productname>PostgreSQL</productname> 7.3,
732       <type>serial</type> sous entendait <literal>UNIQUE</literal>.
733       Ce n'est plus automatique. Si vous souhaitez qu'une colonne
734       serial soit unique ou soit une clé primaire, il faut le préciser,
735       comme pour un autre type.
736      </para>
737     </note>
738
739     <para>
740      Pour insérer la valeur suivante de la séquence dans la colonne
741      <type>serial</type>, il faut faire en sorte d'utiliser la valeur
742      par défaut de la colonne.
743      Cela peut se faire de deux façons: soit en excluant cette
744      colonne de la liste des colonnes de la commande
745      <command>INSERT</command>, ou en utilisant le mot clé
746      <literal>DEFAULT</literal>.
747     </para>
748
749     <para>
750      Les types <type>serial</type> et <type>serial4</type> sont
751      identiques: ils créent tous les deux des colonnes
752      <type>integer</type>. Les types <type>bigserial</type> et
753      <type>serial8</type> fonctionnent de la même façon, et créent des
754      colonnes <type>bigint</type>. <type>bigserial</type> doit
755      être utilisé si vous pensez utiliser plus de 2<superscript>31</superscript>
756      identifiants dans toute la vie de la table.
757     </para>
758
759     <para>
760      La séquence créée pour une colonne <type>serial</type> est
761      automatiquement supprimée quand la colonne correspondante est
762      supprimée, et ne peut l'être autrement. (Ce n'était
763      pas le cas avant la version 7.3 de
764      <productname>PostgreSQL</productname>. Notez que ce lien de
765      suppression automatique de séquence ne fonctionnera pas pour
766      une base restaurée d'une sauvegarde SQL (dump) antérieure à la
767      version 7.3. La sauvegarde ne contient en effet pas l'information
768      nécessaire à l'établissement du lien de dépendance.)
769      De plus, ce lien de dépendance n'est mis que pour la colonne de
770      type <type>serial</> elle même. Si d'autres colonnes référencent
771      la séquence (par exemple en appellent la fonction
772      <function>nextval</>), elles ne peuvent plus fonctionner si la
773      séquence est supprimée.
774      Utiliser le type <type>serial</> de cette façon n'est pas recommandé.
775      Si vous souhaitez remplir plusieurs colonnes avec le même générateur de
776      séquence, créez la séquence indépendamment.
777     </para>
778    </sect2>
779   </sect1>
780
781   <sect1 id="datatype-money">
782    <title>Types monétaires</title>
783
784    <note>
785     <para>
786      Le type <type>money</type> est obsolète. Utilisez plutôt les 
787      types <type>numeric</type> ou <type>decimal</type>, en
788      combinaison avec la fonction <function>to_char</function>.
789     </para>
790    </note>
791
792    <para>
793     Le type <type>money</type> stocke un montant d'une devise avec
794     un nombre fixe de chiffres après la virgule. Voir <xref
795     linkend="datatype-money-table">.
796     De nombreux formats sont acceptés en entrée, dont les entiers et
797     les nombre à virgule flottante ainsi que les formats classiques
798     de devises, comme <literal>'$1,000.00'</literal>.
799     Le format de sortie est généralement ce dernier, mais dépend de la
800     localisation.
801    </para>
802
803     <table id="datatype-money-table">
804      <title>Types monétaires</title>
805      <tgroup cols="4">
806       <thead>
807        <row>
808         <entry>Nom</entry>
809         <entry>Taille de stockage</entry>
810         <entry>Description</entry>
811         <entry>Étendue</entry>
812        </row>
813       </thead>
814       <tbody>
815        <row>
816         <entry>money</entry>
817         <entry>4 octets</entry>
818         <entry>montants de devise</entry>
819         <entry>-21474836.48 à +21474836.47</entry>
820        </row>
821       </tbody>
822      </tgroup>
823     </table>
824   </sect1>
825
826
827   <sect1 id="datatype-character">
828    <title>Types caractères</title>
829
830    <indexterm zone="datatype-character">
831     <primary>Chaîne de caractères</primary>
832     <secondary>types de données</secondary>
833    </indexterm>
834
835    <indexterm>
836     <primary>Chaîne</primary>
837     <see>Chaîne de caractères</see>
838    </indexterm>
839
840    <indexterm zone="datatype-character">
841     <primary>character</primary>
842    </indexterm>
843
844    <indexterm zone="datatype-character">
845     <primary>character varying</primary>
846    </indexterm>
847
848    <indexterm zone="datatype-character">
849     <primary>text</primary>
850    </indexterm>
851
852    <indexterm zone="datatype-character">
853     <primary>char</primary>
854    </indexterm>
855
856    <indexterm zone="datatype-character">
857     <primary>varchar</primary>
858    </indexterm>
859
860     <table id="datatype-character-table">
861 <title>Types caractères</title>
862      <tgroup cols="2">
863       <thead>
864        <row>
865         <entry>Nom</entry>
866         <entry>Description</entry>
867        </row>
868       </thead>
869       <tbody>
870        <row>
871         <entry><type>character varying(<replaceable>n</>)</type>, <type>varchar(<replaceable>n</>)</type></entry>
872         <entry>Longueur variable avec limite</entry>
873        </row>
874        <row>
875         <entry><type>character(<replaceable>n</>)</type>, <type>char(<replaceable>n</>)</type></entry>
876         <entry>longueur fixe, comblé avec des espaces</entry>
877        </row>
878        <row>
879         <entry><type>text</type></entry>
880         <entry>longueur variable illimitée</entry>
881        </row>
882      </tbody>
883      </tgroup>
884     </table>
885
886    <para>
887     <xref linkend="datatype-character-table"> montre les types
888     génériques disponibles dans <productname>PostgreSQL</productname>.
889    </para>
890
891    <para>
892     <acronym>SQL</acronym> définit deux types de caractères principaux:
893     <type>character varying(<replaceable>n</>)</type> et
894     <type>character(<replaceable>n</>)</type>, où <replaceable>n</>
895     est un entier positif.
896     Ces deux types peuvent stocker des chaînes de caractères de taille
897     inférieure ou égale à <replaceable>n</replaceable>. Une tentative d'insérer
898     une chaîne trop longue donnera une erreur, à moins que les
899     caractères en trop soient tous des espaces, auquel cas la chaîne
900     sera tronquée à la taille maximale. (Cette exception un rien
901     étrange est imposée par la norme <acronym>SQL</acronym>).
902     Si la chaîne à stocker est plus petite que la taille déclarée,
903     elle sera complétée par des espaces pour le type
904     <type>character</type>, et elle sera stockée telle quelle pour le
905     type <type>character varying</type>.
906    </para>
907
908     <para>
909      Si vous transtypez (cast) explicitement une valeur en
910      <type>character varying(<replaceable>n</replaceable>)</type> ou en
911      <type>character(<replaceable>n</replaceable>)</type>, alors une chaîne trop
912      longue sera tronquée à <replaceable>n</replaceable> caractères sans que
913      cela génère d'erreur. (Ce comportement est aussi imposé par
914      la norme <acronym>SQL</acronym>.)
915     </para>
916
917    <note>
918     <para>
919      Avant <productname>PostgreSQL</productname> 7.2, les chaînes trop longues
920      étaient toujours tronquées sans générer d'erreur, que ce soit
921      par une transformation explicite ou implicite.
922     </para>
923    </note>
924
925    <para>
926     Les notations <type>varchar(<replaceable>n</replaceable>)</type> et
927     <type>char(<replaceable>n</replaceable>)</type> sont des alias pour
928     <type>character varying(<replaceable>n</replaceable>)</type> et
929     <type>character(<replaceable>n</replaceable>)</type>, respectivement.
930     <type>character</type> sans indication de taille est équivalent à
931     <type>character(1)</type>. Si <type>character varying</type> est
932     utilisé sans indicateur de taille, le type accepte des chaînes de
933     toutes tailles. Il s'agit là d'une spécificité de
934     <productname>PostgreSQL</productname>.
935    </para>
936
937    <para>
938     <productname>PostgreSQL</productname> propose aussi le type
939     <type>text</type>, qui permet de stocker des chaînes de n'importe
940     quelle taille. Bien que le type <type>text</type> ne soit pas
941     dans le standard <acronym>SQL</acronym>, plusieurs autres systèmes de
942     gestion de bases de données SQL le proposent aussi.
943    </para>
944
945    <para>
946     L'espace de stockage utilisé pour les données de ces types est
947     de 4 octets en plus de la taille de la chaîne, plus le remplissage
948     dans le cas du type <type>character</type>.
949     Les grandes chaînes sont automatiquement compressées par le
950     système, si bien que l'espace effectivement utilisé peut être
951     inférieur. Les grandes chaînes sont aussi stockées dans des tables
952     d'arrière plan, afin de ne pas ralentir l'accès aux autres
953     colonnes plus petites.
954     Dans tous les cas, la taille maximale possible pour une chaîne de
955     caractères est de l'ordre 1 Go. (La taille maximale pour
956     <replaceable>n</replaceable> dans la déclaration de type est plus petite
957     que cela. Il ne serait pas très utile de le changer parce qu'avec
958     l'encodage des caractères sur plusieurs octets, le nombre de caractères
959     et d'octets peuvent être très différents. Si vous voulez stocker
960     de longues chaînes sans limite de taille spécifique, utilisez le type
961     <type>text</type> ou le type <type>character varying</type> sans indiquer
962     de taille, plutôt que d'indiquer une limite de taille arbitraire.)
963    </para>
964
965    <tip>
966     <para>
967      Il n'y a pas de différence de performance entre ces trois types,
968      à part la place disque supplémentaire pour le type qui remplit les
969      vides avec des espaces.
970     </para>
971    </tip>
972
973    <para>
974     Voyez <xref linkend="sql-syntax-strings"> pour avoir plus d'informations
975     sur la syntaxe des littéraux de chaînes, et <xref linkend="functions">
976     pour avoir des informations sur les opérateurs et les fonctions.
977    </para>
978
979    <example>
980     <title>Utilisation des types caractères</title>
981
982 <programlisting>
983 CREATE TABLE test1 (a character(4));
984 INSERT INTO test1 VALUES ('ok');
985 SELECT a, char_length(a) FROM test1; -- <co id="co.datatype-char">
986 <computeroutput>
987   a   | char_length
988 ------+-------------
989  ok   |           4
990 </computeroutput>
991
992 CREATE TABLE test2 (b varchar(5));
993 INSERT INTO test2 VALUES ('ok');
994 INSERT INTO test2 VALUES ('bien      ');
995 INSERT INTO test2 VALUES ('trop long');
996 <computeroutput>ERROR:  value too long for type character varying(5)</computeroutput>
997 INSERT INTO test2 VALUES ('trop long'::varchar(5)); -- troncature explicite
998 SELECT b, char_length(b) FROM test2;
999 <computeroutput>
1000    b   | char_length
1001 -------+-------------
1002  ok    |           2
1003  bien  |           5
1004  trop  |           5
1005 </computeroutput>
1006 </programlisting>
1007     <calloutlist>
1008      <callout arearefs="co.datatype-char">
1009       <para>
1010        La fonction <function>char_length</function> est décrite dans
1011        <xref linkend="functions-string">.
1012       </para>
1013      </callout>
1014     </calloutlist>
1015    </example>
1016
1017    <para>
1018     Il y a deux autres types caractères de taille constante dans
1019     <productname>PostgreSQL</productname>, décrits dans <xref
1020     linkend="datatype-character-special-table">. Le type <type>name</type>
1021     existe <emphasis>seulement</emphasis> pour le stockage des identifiants
1022     dans les catalogues systèmes, et n'est pas destiné à être utilisé par
1023     les utilisateurs normaux. Sa taille est actuellement définie à 64 octets
1024     (63 utilisables plus le terminateur), mais doit être référencée en
1025     utilisant la constante <symbol>NAMEDATALEN</symbol>. La taille est
1026     définie à la compilation (et est donc ajustable pour des besoins
1027     particuliers). La taille maximale par défaut pourrait changer dans une
1028     prochaine version. Le type <type>"char"</type> (notez les guillemets)
1029     est différent de <type>char(1)</type> car il n'utilise qu'un seul octet
1030     de stockage. Il est utilisé dans les catalogues systèmes comme un type
1031     d'énumération économique.
1032    </para>
1033
1034     <table id="datatype-character-special-table">
1035      <title>Types caractères spéciaux</title>
1036      <tgroup cols="3">
1037       <thead>
1038        <row>
1039         <entry>Nom</entry>
1040         <entry>Taille de stockage</entry>
1041         <entry>Description</entry>
1042        </row>
1043       </thead>
1044       <tbody>
1045        <row>
1046         <entry><type>"char"</type></entry>
1047         <entry>1 octet</entry>
1048         <entry>type interne de 1 caractère</entry>
1049        </row>
1050        <row>
1051         <entry><type>name</type></entry>
1052         <entry>64 octets</entry>
1053         <entry>type interne pour les noms d'objets</entry>
1054        </row>
1055       </tbody>
1056      </tgroup>
1057     </table>
1058
1059   </sect1>
1060
1061  <sect1 id="datatype-binary">
1062   <title>Types de données binaires</title>
1063
1064   <indexterm zone="datatype-binary">
1065    <primary>binary data</primary>
1066   </indexterm>
1067
1068   <indexterm zone="datatype-binary">
1069    <primary>bytea</primary>
1070   </indexterm>
1071    <para>
1072     Le type de données <type>bytea</type> permet de stocker des chaînes
1073     binaires; voir <xref linkend="datatype-binary-table">.
1074    </para>
1075
1076    <table id="datatype-binary-table">
1077     <title>Types de données binaires</title>
1078     <tgroup cols="3">
1079      <thead>
1080       <row>
1081        <entry>Nom</entry>
1082        <entry>Espace de stockage</entry>
1083        <entry>Description</entry>