-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathdatatype.sgml
4025 lines (3573 loc) · 144 KB
/
datatype.sgml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!--
$PostgreSQL: pgsql/doc/src/sgml/datatype.sgml,v 1.154 2005/01/17 18:47:15 tgl Exp $
-->
<chapter id="datatype">
<title id="datatype-title">Tipos de dado</title>
<indexterm zone="datatype">
<primary>tipo de dado</primary>
</indexterm>
<indexterm>
<primary>tipo</primary>
<see>tipo de dado</see>
</indexterm>
<para>
O <productname>PostgreSQL</productname> disponibiliza para os usuários
um amplo conjunto de tipos de dado nativos. Os usuários podem adicionar
novos tipos ao <productname>PostgreSQL</productname>
utilizando o comando <command>CREATE TYPE</command>.
<footnote>
<para>
O SQL suporta três modalidades de tipos de dado: <emphasis>tipos de dado
pré-definidos</emphasis>, <emphasis>tipos construídos</emphasis> e
<emphasis>tipos definidos pelo usuário</emphasis>.
Os tipos pré-definidos são algumas vezes chamados de <quote>tipos
nativos</quote>, mas não neste Padrão Internacional. Os tipos
definidos pelo usuário podem ser definidos por um padrão, por uma
implementação, ou por um aplicativo.
</para>
<para>
O tipo construído é especificado utilizando um dos construtores de
tipo de dado do SQL: <literal>ARRAY</literal>, <literal>MULTISET</literal>,
<literal>REF</literal> e <literal>ROW</literal>. O tipo construído é
um tipo matriz, um tipo multi-conjunto, um tipo referência ou um tipo
linha, se for especificado por <literal>ARRAY</literal>,
<literal>MULTISET</literal>, <literal>REF</literal> e
<literal>ROW</literal>, respectivamente. Os tipos matriz e multi-conjunto
são conhecidos genericamente como tipos coleção.
</para>
<para>
(ISO-ANSI Working Draft) Foundation (SQL/Foundation), August 2003,
ISO/IEC JTC 1/SC 32, 25-jul-2003, ISO/IEC 9075-2:2003 (E) (N. do T.)
</para>
</footnote>
<footnote>
<para>
Todo tipo de dado inclui um valor especial, chamado de <emphasis>valor
nulo</emphasis>, algumas vezes denotado pela palavra chave NULL. Este
valor difere dos demais valores com relação aos seguintes aspectos.
</para>
<para>
— Uma vez que o valor nulo está presente em todo tipo de dado, o tipo
de dado do valor nulo implicado pela palavra chave NULL não pode ser
inferido; portanto NULL pode ser utilizado para denotar o valor nulo apenas
em certos contextos, e não em todos os lugares onde um literal é permitido.
</para>
<para>
— Embora o valor nulo não seja igual a qualquer outro valor, nem seja
não igual a qualquer outro valor - é <emphasis>desconhecido</emphasis>
se é igual ou não a qualquer outro valor - em alguns contextos, valores
nulos múltiplos são tratados juntos; por exemplo, a <cláusula
group by> trata todos os valores nulos juntos.
</para>
<para>
(ISO-ANSI Working Draft) Framework (SQL/Framework), August 2003,
ISO/IEC JTC 1/SC 32, 25-jul-2003, ISO/IEC 9075-2:2003 (E) (N. do T.)
</para>
</footnote>
<footnote>
<para>
<literal>literal</literal> —
um valor usado exatamente da forma como é visto. Por exemplo, o número
25 e a cadeia de caracteres "Alô" são ambos literais. Os literais podem
ser utilizados em expressões, e podem ser atribuídos literais para
constantes ou variáveis no <productname>Visual Basic</productname>.
<ulink url="http://www.microsoft.com/atwork/glossary.mspx">Microsoft
Glossary for Business Users</ulink> (N. do T.)
</para>
</footnote>
</para>
<para>
A <xref linkend="datatype-table"> mostra todos os tipos de dado nativos de
propósito geral. A maioria dos nomes alternativos listados na coluna
<quote>Aliases</quote> é o nome utilizado internamente pelo
<productname>PostgreSQL</productname> por motivos históricos. Além desses,
existem alguns tipos usados internamente ou em obsolescência
<footnote>
<para>
<literal>deprecated</literal> —
Dito de um programa ou funcionalidade que é considerada em obsolescência
e no processo de ter sua utilização gradualmente interrompida, geralmente
em favor de uma determinada substituição. As funcionalidades em
obsolescência podem, infelizmente, demorar muitos anos para desaparecer.
<ulink url="http://www.catb.org/~esr/jargon/html/D/deprecated.html">The
Jargon File</ulink> (N. do T.)
</para>
</footnote>
que não são mostrados aqui.
</para>
<table id="datatype-table">
<title>Tipos de dado</title>
<tgroup cols="3">
<thead>
<row>
<entry>Nome</entry>
<entry>Aliases</entry>
<entry>Descrição</entry>
</row>
</thead>
<tbody>
<row>
<entry><type>bigint</type></entry>
<entry><type>int8</type></entry>
<entry>inteiro de oito bytes com sinal
<footnote>
<para>
Os tipos de dado NUMERIC, DECIMAL, SMALLINT, INTEGER e BIGINT
são referenciados coletivamente como <emphasis>tipos numéricos
exatos</emphasis>.
(ISO-ANSI Working Draft) Foundation (SQL/Foundation), August 2003,
ISO/IEC JTC 1/SC 32, 25-jul-2003, ISO/IEC 9075-2:2003 (E) (N. do T.)
</para>
</footnote>
</entry>
</row>
<row>
<entry><type>bigserial</type></entry>
<entry><type>serial8</type></entry>
<entry>inteiro de oito bytes com auto-incremento</entry>
</row>
<row>
<entry><type>bit [ (<replaceable>n</replaceable>) ]</type></entry>
<entry></entry>
<entry>cadeia de bits de comprimento fixo</entry>
</row>
<row>
<entry><type>bit varying [ (<replaceable>n</replaceable>) ]</type></entry>
<entry><type>varbit</type></entry>
<entry>cadeia de bits de comprimento variável
<footnote>
<para>
comprimento variável —
uma característica das cadeias de caracteres e das cadeias binárias
que permite as cadeias conterem qualquer número de caracteres ou de
octetos, respectivamente, entre zero e um número máximo, conhecido
como comprimento máximo em caracteres ou octetos, respectivamente,
da cadeia.
(ISO-ANSI Working Draft) Foundation (SQL/Foundation), August 2003,
ISO/IEC JTC 1/SC 32, 25-jul-2003, ISO/IEC 9075-2:2003 (E) (N. do T.)
</para>
</footnote>
</entry>
</row>
<row>
<entry><type>boolean</type></entry>
<entry><type>bool</type></entry>
<entry>booleano lógico (verdade/falso)</entry>
</row>
<row>
<entry><type>box</type></entry>
<entry></entry>
<entry>caixa retangular no plano</entry>
</row>
<row>
<entry><type>bytea</type></entry>
<entry></entry>
<entry>dados binários (<quote>matriz de bytes</>)</entry>
</row>
<row>
<entry><type>character varying [ (<replaceable>n</replaceable>) ]</type></entry>
<entry><type>varchar [ (<replaceable>n</replaceable>) ]</type></entry>
<entry>cadeia de caracteres de comprimento variável
<footnote>
<para>
Os tipos de dado CHARACTER, CHARACTER VARYING e CHARACTER LARGE
OBJECT são referenciados coletivamente como <emphasis>tipos cadeia
de caracteres</emphasis>.
(ISO-ANSI Working Draft) Foundation (SQL/Foundation), August 2003,
ISO/IEC JTC 1/SC 32, 25-jul-2003, ISO/IEC 9075-2:2003 (E) (N. do T.)
</para>
</footnote>
</entry>
</row>
<row>
<entry><type>character [ (<replaceable>n</replaceable>) ]</type></entry>
<entry><type>char [ (<replaceable>n</replaceable>) ]</type></entry>
<entry>cadeia de caracteres de comprimento fixo</entry>
</row>
<row>
<entry><type>cidr</type></entry>
<entry></entry>
<entry>endereço de rede IPv4 ou IPv6</entry>
</row>
<row>
<entry><type>circle</type></entry>
<entry></entry>
<entry>círculo no plano</entry>
</row>
<row>
<entry><type>date</type></entry>
<entry></entry>
<entry>data de calendário (ano, mês,dia)</entry>
</row>
<row>
<entry><type>double precision</type></entry>
<entry><type>float8</type></entry>
<entry>número de ponto flutuante de precisão dupla
<footnote>
<para>
Os tipos de dado FLOAT, REAL e DOUBLE PRECISION são referenciados
coletivamente como <emphasis>tipos numéricos aproximados</emphasis>.
(ISO-ANSI Working Draft) Foundation (SQL/Foundation), August 2003,
ISO/IEC JTC 1/SC 32, 25-jul-2003, ISO/IEC 9075-2:2003 (E) (N. do T.)
</para>
</footnote>
</entry>
</row>
<row>
<entry><type>inet</type></entry>
<entry></entry>
<entry>endereço de hospedeiro IPv4 ou IPv6</entry>
</row>
<row>
<entry><type>integer</type></entry>
<entry><type>int</type>, <type>int4</type></entry>
<entry>inteiro de quatro bytes com sinal</entry>
</row>
<row>
<entry><type>interval [ (<replaceable>p</replaceable>) ]</type></entry>
<entry></entry>
<entry>espaço de tempo</entry>
</row>
<row>
<entry><type>line</type></entry>
<entry></entry>
<entry>linha infinita no plano</entry>
</row>
<row>
<entry><type>lseg</type></entry>
<entry></entry>
<entry>segmento de linha no plano</entry>
</row>
<row>
<entry><type>macaddr</type></entry>
<entry></entry>
<entry>endereço MAC</entry>
</row>
<row>
<entry><type>money</type></entry>
<entry></entry>
<entry>quantia monetária</entry>
</row>
<row>
<entry><type>numeric [ (<replaceable>p</replaceable>,
<replaceable>s</replaceable>) ]</type></entry>
<entry><type>decimal [ (<replaceable>p</replaceable>,
<replaceable>s</replaceable>) ]</type></entry>
<entry>numérico exato com precisão selecionável</entry>
</row>
<row>
<entry><type>path</type></entry>
<entry></entry>
<entry>caminho geométrico no plano</entry>
</row>
<row>
<entry><type>point</type></entry>
<entry></entry>
<entry>ponto geométrico no plano</entry>
</row>
<row>
<entry><type>polygon</type></entry>
<entry></entry>
<entry>caminho geométrico fechado no plano</entry>
</row>
<row>
<entry><type>real</type></entry>
<entry><type>float4</type></entry>
<entry>número de ponto flutuante de precisão simples</entry>
</row>
<row>
<entry><type>smallint</type></entry>
<entry><type>int2</type></entry>
<entry>inteiro de dois bytes com sinal</entry>
</row>
<row>
<entry><type>serial</type></entry>
<entry><type>serial4</type></entry>
<entry>inteiro de quatro bytes com auto-incremento</entry>
</row>
<row>
<entry><type>text</type></entry>
<entry></entry>
<entry>cadeia de caracteres de comprimento variável</entry>
</row>
<row>
<entry><type>time [ (<replaceable>p</replaceable>) ] [ without time zone ]</type></entry>
<entry></entry>
<entry>hora do dia</entry>
</row>
<row>
<entry><type>time [ (<replaceable>p</replaceable>) ] with time zone</type></entry>
<entry><type>timetz</type></entry>
<entry>hora do dia, incluindo a zona horária</entry>
</row>
<row>
<entry><type>timestamp [ (<replaceable>p</replaceable>) ] [ without time zone ]</type></entry>
<entry></entry>
<entry>data e hora</entry>
</row>
<row>
<entry><type>timestamp [ (<replaceable>p</replaceable>) ] with time zone</type></entry>
<entry><type>timestamptz</type></entry>
<entry>data e hora, incluindo a zona horária</entry>
</row>
</tbody>
</tgroup>
</table>
<note>
<title>Compatibilidade</title>
<para>
Os seguintes tipos (ou a citação destes) são especificados pelo padrão
<acronym>SQL</acronym>: <type>bit</type>, <type>bit
varying</type>, <type>boolean</type>, <type>char</type>,
<type>character varying</type>, <type>character</type>,
<type>varchar</type>, <type>date</type>, <type>double
precision</type>, <type>integer</type>, <type>interval</type>,
<type>numeric</type>, <type>decimal</type>, <type>real</type>,
<type>smallint</type>, <type>time</type> (com ou sem zona horária),
<type>timestamp</type> (com ou sem zona horária).
</para>
</note>
<para>
Cada tipo de dado possui uma representação externa determinada pelas
suas funções de entrada e de saída. Muitos tipos nativos possuem
formato externo óbvio. Entretanto, muitos tipos existem apenas no
<productname>PostgreSQL</productname>, como os caminhos geométricos,
ou possuem várias possibilidades para o formato, como os tipos
de data e hora.
Algumas das funções de entrada e saída não são inversíveis, ou seja,
o resultado da função de saída pode perder precisão quando comparado
com a entrada original.
</para>
<sect1 id="datatype-numeric">
<title>Tipos numéricos</title>
<indexterm zone="datatype-numeric">
<primary>tipo de dado</primary>
<secondary>numérico</secondary>
</indexterm>
<para>
Os tipos numéricos consistem em inteiros de dois, quatro e oito bytes,
números de ponto flutuante de quatro e oito bytes, e decimais de
precisão selecionável. A <xref linkend="datatype-numeric-table"> lista os
tipos disponíveis.
</para>
<table id="datatype-numeric-table">
<title>Tipos numéricos</title>
<tgroup cols="4">
<thead>
<row>
<entry>Nome</entry>
<entry>Tamanho de armazenamento</entry>
<entry>Descrição</entry>
<entry>Faixa de valores</entry>
</row>
</thead>
<tbody>
<row>
<entry><type>smallint</></entry>
<entry>2 bytes</entry>
<entry>inteiro com faixa pequena</entry>
<entry>-32768 a +32767</entry>
</row>
<row>
<entry><type>integer</></entry>
<entry>4 bytes</entry>
<entry>escolha usual para inteiro</entry>
<entry>-2147483648 a +2147483647</entry>
</row>
<row>
<entry><type>bigint</></entry>
<entry>8 bytes</entry>
<entry>inteiro com faixa larga</entry>
<entry>-9223372036854775808 a 9223372036854775807</entry>
</row>
<row>
<entry><type>decimal</></entry>
<entry>variável</entry>
<entry>precisão especificada pelo usuário, exato</entry>
<entry>sem limite</entry>
</row>
<row>
<entry><type>numeric</></entry>
<entry>variável</entry>
<entry>precisão especificada pelo usuário, exato</entry>
<entry>sem limite</entry>
</row>
<row>
<entry><type>real</></entry>
<entry>4 bytes</entry>
<entry>precisão variável, inexato</entry>
<entry>precisão de 6 dígitos decimais</entry>
</row>
<row>
<entry><type>double precision</></entry>
<entry>8 bytes</entry>
<entry>precisão variável, inexato</entry>
<entry>precisão de 15 dígitos decimais</entry>
</row>
<row>
<entry><type>serial</></entry>
<entry>4 bytes</entry>
<entry>inteiro com auto-incremento</entry>
<entry>1 a 2147483647</entry>
</row>
<row>
<entry><type>bigserial</type></entry>
<entry>8 bytes</entry>
<entry>inteiro grande com auto-incremento</entry>
<entry>1 a 9223372036854775807</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
A sintaxe das constantes para os tipos numéricos é descrita na
<xref linkend="sql-syntax-constants">. Os tipos numéricos possuem
um conjunto completo de operadores aritméticos e funções
correspondentes. Consulte o <xref linkend="functions"> para obter
informações adicionais. As próximas seções descrevem os tipos em detalhe.
</para>
<sect2 id="datatype-int">
<title>Tipos inteiros</title>
<indexterm zone="datatype-int">
<primary>integer</primary>
</indexterm>
<indexterm zone="datatype-int">
<primary>smallint</primary>
</indexterm>
<indexterm zone="datatype-int">
<primary>bigint</primary>
</indexterm>
<indexterm>
<primary>int4</primary>
<see>integer</see>
</indexterm>
<indexterm>
<primary>int2</primary>
<see>smallint</see>
</indexterm>
<indexterm>
<primary>int8</primary>
<see>bigint</see>
</indexterm>
<para>
Os tipos <type>smallint</type>, <type>integer</type> e
<type>bigint</type> armazenam números inteiros, ou seja,
números sem a parte fracionária, com faixas diferentes.
A tentativa de armazenar um valor fora da faixa permitida resulta em erro.
</para>
<para>
O tipo <type>integer</type> é a escolha usual, porque oferece o melhor
equilíbrio entre faixa de valores, tamanho de armazenamento e desempenho.
Geralmente o tipo <type>smallint</type> só é utilizado quando o espaço em
disco está muito escasso. O tipo <type>bigint</type> somente deve ser
usado quando a faixa de valores de <type>integer</type> não for suficiente,
porque este último é bem mais rápido.
</para>
<para>
O tipo <type>bigint</type> pode não funcionar de modo correto em todas as
plataformas, porque depende de suporte no compilador para inteiros de
oito bytes. Nas máquinas sem este suporte, o <type>bigint</type> age
do mesmo modo que o <type>integer</type> (mas ainda ocupa oito bytes
de armazenamento). Entretanto, não é de nosso conhecimento nenhuma
plataforma razoável onde este caso se aplique.
</para>
<para>
O padrão <acronym>SQL</acronym> somente especifica os tipos inteiros
<type>integer</type> (ou <type>int</type>) e
<type>smallint</type>. O tipo <type>bigint</type>, e os nomes
de tipo <type>int2</type>, <type>int4</type> e
<type>int8</type> são extensões, também compartilhadas
por vários outros sistemas de banco de dados <acronym>SQL</acronym>.
</para>
</sect2>
<sect2 id="datatype-numeric-decimal">
<title>Números com precisão arbitrária</title>
<indexterm zone="datatype-numeric-decimal">
<primary>numérico (tipo de dado)</primary>
</indexterm>
<indexterm>
<primary>decimal</primary>
<see>numérico</see>
</indexterm>
<para>
O tipo <type>numeric</type> pode armazenar números com precisão de até
1.000 dígitos e realizar cálculos exatos. É recomendado, especialmente,
para armazenar quantias monetárias e outras quantidades onde se requeira
exatidão. Entretanto, a aritmética em valores do tipo
<type>numeric</type> é muito lenta se comparada com os tipos inteiros,
ou com os tipos de ponto flutuante descritos na próxima seção.
</para>
<para>
São utilizados os seguintes termos: A
<firstterm>escala</firstterm> do tipo <type>numeric</type> é o
número de dígitos decimais da parte fracionária, à direita do
ponto decimal. A <firstterm>precisão</firstterm> do tipo
<type>numeric</type> é o número total de dígitos significativos de todo
o número, ou seja, o número de dígitos nos dois lados do
ponto decimal. Portanto, o número 23.5141
<footnote>
<para>
Padrão americano: o ponto, e não a vírgula, separando a parte
fracionária. (N. do T.)
</para>
</footnote>
possui precisão igual a 6 e escala igual a 4. Os inteiros podem ser
considerados como tendo escala igual a zero.
</para>
<para>
Tanto a precisão máxima quanto a escala de uma coluna do tipo
<type>numeric</type> podem ser configuradas. Para declarar uma coluna do
tipo <type>numeric</type> é utilizada a sintaxe:
<programlisting>
NUMERIC(<replaceable>precisão</replaceable>, <replaceable>escala</replaceable>)
</programlisting>
A precisão deve ser um número positivo, enquanto a escala pode ser zero ou
positiva. Como forma alternativa,
<programlisting>
NUMERIC(<replaceable>precisão</replaceable>)
</programlisting>
define a escala como sendo igual a 0. Especificando-se
<programlisting>
NUMERIC
</programlisting>
sem qualquer precisão ou escala é criada uma coluna onde podem ser
armazenados valores numéricos com qualquer precisão ou escala, até a
precisão limite da implementação. Uma coluna deste tipo não converte os
valores de entrada para nenhuma escala em particular, enquanto as colunas
do tipo <type>numeric</type> com escala declarada convertem os valores da
entrada para esta escala (O padrão <acronym>SQL</acronym> requer
a escala padrão igual a 0, ou seja, uma conversão para a precisão
inteira. Isto foi considerado sem utilidade. Havendo preocupação com a
portabilidade, a precisão e a escala devem ser sempre especificadas
explicitamente).
</para>
<para>
Se a escala do valor a ser armazenado for maior que a escala declarada
para a coluna, o sistema arredonda o valor para o número de dígitos
fracionários especificado. Depois, se o número de dígitos à esquerda do
ponto decimal exceder a precisão declarada menos a escala declarada,
é gerado um erro.
</para>
<example id="datatype-numeric-round">
<title>Arredondamento em tipo <type>numeric</type></title>
<para>
Abaixo estão mostrados exemplos de inserção de dados em um campo do tipo
<type>numeric</type>. No terceiro exemplo o arredondamento faz com que
a precisão do campo seja excedida.
<footnote>
<para>
Exemplo escrito pelo tradutor, não fazendo parte do manual original.
</para>
</footnote>
</para>
<para>
A execução deste exemplo no <productname>SQL Server 2000</productname>
e no <productname>Oracle 10g</productname> produziu o mesmo resultado,
mas o <productname>DB2 8.1</productname> em vez de arredondar trunca
as casas decimais e, por isso, a precisão não é excedida.
</para>
<screen>
<prompt>=></prompt> <userinput>CREATE TABLE t ( c NUMERIC(6,3));</userinput>
<prompt>=></prompt> <userinput>INSERT INTO t VALUES (998.9991);</userinput>
<prompt>=></prompt> <userinput>INSERT INTO t VALUES (998.9999);</userinput>
<prompt>=></prompt> <userinput>SELECT * FROM t;</userinput>
<computeroutput>
c
---------
998.999
999.000
(2 linhas)
</computeroutput>
<prompt>=></prompt> <userinput>INSERT INTO t VALUES (999.9999);</userinput>
<computeroutput>
ERRO: estouro de campo numérico
DETALHE: O valor absoluto é maior ou igual a 10^3 para campo com precisão 6, escala 3.
</computeroutput>
</screen>
</example>
<para>
Os valores numéricos são armazenados fisicamente sem zeros adicionais no
início ou no final. Portanto, a precisão e a escala declaradas para uma
coluna são as alocações máximas, e não fixas (Sob este aspecto o tipo
<type>numeric</> é mais semelhante ao tipo
<type>varchar(<replaceable>n</>)</type> do que ao tipo
<type>char(<replaceable>n</>)</type>).
</para>
<para>
Além dos valores numéricos ordinários o tipo <type>numeric</type>
aceita o valor especial <literal>NaN</>, que significa
<quote>não-é-um-número</quote> (<literal>not-a-number</literal>).
Toda operação envolvendo <literal>NaN</> produz outro <literal>NaN</>.
Para escrever este valor como uma constante em um comando SQL deve-se
colocá-lo entre apóstrofos como, por exemplo,
<literal>UPDATE tabela SET x = 'NaN'</>. Na entrada, a cadeia de
caracteres <literal>NaN</> é reconhecida sem que haja distinção entre
letras maiúsculas e minúsculas.
</para>
<para>
Os tipos <type>decimal</type> e <type>numeric</type> são equivalentes.
Os dois tipos fazem parte do padrão <acronym>SQL</acronym>.
</para>
</sect2>
<sect2 id="datatype-float">
<title>Tipos de ponto flutuante</title>
<indexterm zone="datatype-float">
<primary>real</primary>
</indexterm>
<indexterm zone="datatype-float">
<primary>precisão dupla</primary>
</indexterm>
<indexterm>
<primary>float4</primary>
<see>real</see>
</indexterm>
<indexterm>
<primary>float8</primary>
<see>precisão dupla</see>
</indexterm>
<indexterm zone="datatype-float">
<primary>ponto flutuante</primary>
</indexterm>
<para>
Os tipos de dado <type>real</type> e <type>double precision</type> são
tipos numéricos não exatos de precisão variável.
Na prática, estes tipos são geralmente implementações do <quote>Padrão
<acronym>IEEE</acronym> 754 para Aritmética Binária de Ponto
Flutuante</quote> (de precisão simples e dupla, respectivamente), conforme
suportado pelo processador, sistema operacional e compilador utilizados.
</para>
<para>
Não exato significa que alguns valores não podem ser convertidos exatamente
para o formato interno, sendo armazenados como aproximações. Portanto, ao
se armazenar e posteriormente imprimir um valor podem ocorrer pequenas
discrepâncias. A gerência destes erros, e como se propagam através dos
cálculos, é assunto de um ramo da matemática e da ciência da computação
que não será exposto aqui, exceto os seguintes pontos:
<itemizedlist>
<listitem>
<para>
Se for necessário armazenamento e cálculos exatos (como em quantias
monetárias), em vez de tipos de ponto flutuante deve ser utilizado o
tipo <type>numeric</type>.
</para>
</listitem>
<listitem>
<para>
Se for desejado efetuar cálculos complicados usando tipos de ponto
flutuante para algo importante, especialmente dependendo de certos
comportamentos em situações limites (infinito ou muito próximo de zero),
a implementação deve ser avaliada cuidadosamente.
</para>
</listitem>
<listitem>
<para>
A comparação de igualdade de dois valores de ponto flutuante pode
funcionar conforme o esperado, ou não.
</para>
</listitem>
</itemizedlist>
</para>
<para>
Na maioria das plataformas o tipo <type>real</type> possui uma faixa de
pelo menos 1E-37 a 1E+37, com precisão de pelo menos 6 dígitos decimais.
O tipo <type>double precision</type> normalmente possui uma faixa em torno
de 1E-307 a 1E+308 com precisão de pelo menos 15 dígitos. Os valores
muito pequenos ou muito grandes causam erro. O arredondamento pode
acontecer se a precisão do número entrado for muito grande.
Os números muito próximos de zero, que não podem ser representados de forma
distinta de zero, causam erro de <literal>underflow</literal>.
</para>
<para>
Além dos valores numéricos ordinários, os tipos de ponto flutuante
possuem diversos valores especiais:
<literallayout>
<literal>Infinity</literal>
<literal>-Infinity</literal>
<literal>NaN</literal>
</literallayout>
Estes valores representam os valores especiais do padrão IEEE 754
<quote>infinito</quote>, <quote>infinito negativo</quote> e
<quote>não-é-um-número</quote>, respectivamente (Nas máquinas cuja
aritmética de ponto flutuante não segue o padrão IEEE 754, estes valores
provavelmente não vão funcionar da forma esperada). Ao se escrever estes
valores como constantes em um comando SQL deve-se colocá-los entre
apóstrofos como, por exemplo, <literal>UPDATE tabela SET x = 'Infinity'</>.
Na entrada, estas cadeias de caracteres são reconhecidas sem que haja
distinção entre letras maiúsculas e minúsculas
</para>
<para>
O <productname>PostgreSQL</productname> também suporta a notação do padrão
SQL <type>float</type> e <type>float(<replaceable>p</replaceable>)</type>
para especificar tipos numéricos inexatos. Neste caso,
<replaceable>p</replaceable> especifica a precisão mínima aceitável em
dígitos binários. O <productname>PostgreSQL</productname> aceita de
<type>float(1)</type> a <type>float(24)</type> como selecionando o
tipo <type>real</type>, enquanto <type>float(25)</type> a
<type>float(53)</type> selecionam <type>double precision</type>.
Os valores de <replaceable>p</replaceable> fora da faixa permitida
ocasionam erro.
<type>float</type> sem precisão especificada é assumido como significando
<type>double precision</type>.
</para>
<note>
<para>
Antes do <productname>PostgreSQL</productname> 7.4 a precisão em
<type>float(<replaceable>p</replaceable>)</type> era considerada como
significando a quantidade de dígitos decimais, mas foi corrigida para
corresponder ao padrão SQL, que especifica que a precisão é medida em
dígitos binários. A premissa que <type>real</type> e
<type>double precision</type> possuem exatamente 24 e 53 bits na
mantissa, respectivamente, está correta para implementações em acordo
com o padrão IEEE para números de ponto flutuante. Nas plataformas
não-IEEE pode ser um pouco diferente, mas para simplificar as mesmas
faixas de <replaceable>p</replaceable> são utilizadas em todas as
plataformas.
</para>
</note>
</sect2>
<sect2 id="datatype-serial">
<title>Tipos seriais</title>
<indexterm zone="datatype-serial">
<primary>serial</primary>
</indexterm>
<indexterm zone="datatype-serial">
<primary>bigserial</primary>
</indexterm>
<indexterm zone="datatype-serial">
<primary>serial4</primary>
</indexterm>
<indexterm zone="datatype-serial">
<primary>serial8</primary>
</indexterm>
<indexterm>
<primary>auto-incremento</primary>
<see>serial</see>
</indexterm>
<indexterm>
<primary>seqüência</primary>
<secondary>e o tipo serial</secondary>
</indexterm>
<para>
Os tipos de dado <type>serial</type> e <type>bigserial</type>
não são tipos verdadeiros, mas meramente uma
notação conveniente para definir colunas identificadoras únicas
(semelhante à propriedade <literal>AUTO_INCREMENTO</literal> existente
em alguns outros bancos de dados). Na implementação corrente especificar
<programlisting>
CREATE TABLE <replaceable class="parameter">nome_da_tabela</replaceable> (
<replaceable class="parameter">nome_da_coluna</replaceable> SERIAL
);
</programlisting>
equivale a especificar:
<programlisting>
CREATE SEQUENCE <replaceable class="parameter">nome_da_tabela</replaceable>_<replaceable class="parameter">nome_da_coluna</replaceable>_seq;
CREATE TABLE <replaceable class="parameter">nome_da_tabela</replaceable> (
<replaceable class="parameter">nome_da_coluna</replaceable> integer DEFAULT nextval('<replaceable class="parameter">nome_da_tabela</replaceable>_<replaceable class="parameter">nome_da_coluna</replaceable>_seq') NOT NULL
);
</programlisting>
Conforme visto, foi criada uma coluna do tipo inteiro e feito o valor
padrão ser atribuído a partir de um gerador de seqüência. A restrição
<literal>NOT NULL</literal> é aplicada para garantir que não pode ser
inserido o valor nulo explicitamente. Na maior parte das vezes, deve ser
colocada uma restrição <literal>UNIQUE</literal> ou
<literal>PRIMARY KEY</literal> para não permitir a inserção de valores
duplicados por acidente, mas isto não é automático.
</para>
<note>
<para>
Antes do <productname>PostgreSQL</productname> 7.3 <type>serial</type>
implicava <literal>UNIQUE</literal>, mas isto não é mais automático.
Se for desejado que a coluna serial esteja em uma restrição de unicidade
ou de chave primária isto deve ser especificado, da mesma forma
como em qualquer outro tipo de dado.
</para>
</note>
<para>
Para inserir o próximo valor da seqüência em uma coluna do tipo
<type>serial</type> deve ser especificada a atribuição do valor padrão
à coluna <type>serial</type>, o que pode ser feito omitindo a
coluna na lista de colunas no comando <command>INSERT</command>, ou através
da utilização da palavra chave <literal>DEFAULT</literal>.
</para>
<para>
Os nomes de tipo <type>serial</type> e <type>serial4</type> são
equivalentes: ambos criam colunas do tipo <type>integer</type>.
Os nomes de tipo <type>bigserial</type> e <type>serial8</type> funcionam
da mesma maneira, exceto por criarem uma coluna <type>bigint</type>.
Deve ser utilizado <type>bigserial</type> se forem esperados
mais de 2<superscript>31</superscript> identificadores durante a
existência da tabela.
</para>
<para>
A seqüência criada para a coluna do tipo <type>serial</type> é
removida automaticamente quando a coluna que a definiu é removida, e
não pode ser removida de outra forma (Isto não era verdade nas versões do
<productname>PostgreSQL</productname> anteriores a 7.3. Deve ser observado
que este vínculo de remoção automática não ocorre em uma seqüência
criada pela restauração da cópia de segurança de um banco de dados pré-7.3;
a cópia de segurança não contém as informações necessárias para estabelecer
o vínculo de dependência). Além disso, a dependência entre a seqüência e a
coluna é feita apenas para a própria coluna <type>serial</type>; se
qualquer outra coluna fizer referência à seqüência (talvez chamando
manualmente a função <function>nextval()</function>), haverá rompimento se
a seqüência for removida. Esta forma de utilizar as seqüências das colunas
<type>serial</type> é considerada um estilo ruim. Se for desejado suprir
várias colunas a partir do mesmo gerador de seqüência, a seqüência deve ser
criada como um objeto independente.
</para>
<example id="datatype-serial-restart">
<title>Alteração da seqüência da coluna serial</title>
<para>
A seqüência criada para a coluna do tipo <type>serial</type> pode ter seus
parâmetros alterados através do comando <xref linkend="sql-altersequence">,
da mesma forma que qualquer outra seqüência criada através do comando
<xref linkend="sql-createsequence">.
Este exemplo mostra como proceder para fazer com que o valor inicial
da coluna do tipo <type>serial</type> seja igual a 1000.
<footnote>
<para>
Exemplo escrito pelo tradutor, não fazendo parte do manual original.
</para>
</footnote>
<screen>
<prompt>=></prompt> <userinput>CREATE TABLE t ( c1 SERIAL, c2 TEXT);</userinput>
<computeroutput>
NOTICE: CREATE TABLE will create implicit sequence "t_c1_seq" for "serial" column "t.c1"
CREATE TABLE
</computeroutput>
<prompt>=></prompt> <userinput>\ds</userinput>
<computeroutput>
Lista de relações
Esquema | Nome | Tipo | Dono
---------+----------+-----------+----------
public | t_c1_seq | seqüência | postgres
(1 linha)
</computeroutput>
<prompt>=></prompt> <userinput>ALTER SEQUENCE t_c1_seq RESTART WITH 1000;</userinput>
<prompt>=></prompt> <userinput>INSERT INTO t VALUES (DEFAULT, 'Primeira linha');</userinput>
<prompt>=></prompt> <userinput>SELECT * FROM t;</userinput>
<computeroutput>
c1 | c2
------+----------------
1000 | Primeira linha
(1 linha)
</computeroutput>
</screen>
</para>
</example>
</sect2>
</sect1>
<sect1 id="datatype-money">
<title>Tipos monetários</title>
<note>
<para>
O tipo <type>money</type> está em obsolescência. Em seu lugar deve ser
utilizado o tipo <type>numeric</type> ou <type>decimal</type>, em
combinação com a função <function>to_char</function>.
</para>
</note>
<para>
O tipo <type>money</type> armazena a quantia monetária com uma
precisão fracionária fixa; consulte a <xref linkend="datatype-money-table">.
A entrada é aceita em vários formatos, incluindo literais inteiros
e de ponto flutuante, e também o formato monetário <quote>típico</quote>,
como <literal>'$1,000.00'</literal>.
A saída geralmente é neste último formato, mas depende do idioma).
</para>
<table id="datatype-money-table">