<type>real</type>,
<type>smallint</type>, <type>time</type> (with or without time zone),
<type>timestamp</type> (with or without time zone),
<type>xml</type>.
</para>
</note>
<para>
Each data type has an external representation determined by its input
and output functions. Many of the built-in types have
obvious external formats. However, several types are either unique
to <productname>PostgreSQL</productname>, such as geometric
paths, or have several possible formats, such as the date
and time types.
Some of the input and output functions are not invertible, i.e.,
the result of an output function might lose accuracy when compared to
the original input.
</para>
<sect1 id="datatype-numeric">
<title>Numeric Types</title>
<indexterm zone="datatype-numeric">
<primary>data type</primary>
<secondary>numeric</secondary>
</indexterm>
<para>
Numeric types consist of two-, four-, and eight-byte integers,
four- and eight-byte floating-point numbers, and selectable-precision
decimals. <xref linkend="datatype-numeric-table"/> lists the
available types.
</para>
<table id="datatype-numeric-table">
<title>Numeric Types</title>
<tgroup cols="4">
<colspec colname="col1" colwidth="2*"/>
<colspec colname="col2" colwidth="1*"/>
<colspec colname="col3" colwidth="2*"/>
<colspec colname="col4" colwidth="2*"/>
<thead>
<row>
<entry>Name</entry>
<entry>Storage Size</entry>
<entry>Description</entry>
<entry>Range</entry>
</row>
</thead>
<tbody>
<row>
<entry><type>smallint</type></entry>
<entry>2 bytes</entry>
<entry>small-range integer</entry>
<entry>-32768 to +32767</entry>
</row>
<row>
<entry><type>integer</type></entry>
<entry>4 bytes</entry>
<entry>typical choice for integer</entry>
<entry>-2147483648 to +2147483647</entry>
</row>
<row>
<entry><type>bigint</type></entry>
<entry>8 bytes</entry>
<entry>large-range integer</entry>
<entry>-9223372036854775808 to +9223372036854775807</entry>
</row>
<row>
<entry><type>decimal</type></entry>
<entry>variable</entry>
<entry>user-specified precision, exact</entry>
<entry>up to 131072 digits before the decimal point; up to 16383 digits after the decimal point</entry>
</row>
<row>
<entry><type>numeric</type></entry>
<entry>variable</entry>
<entry>user-specified precision, exact</entry>
<entry>up to 131072 digits before the decimal point; up to 16383 digits after the decimal point</entry>
</row>
<row>
<entry><type>real</type></entry>
<entry>4 bytes</entry>
<entry>variable-precision, inexact</entry>
<entry>6 decimal digits precision</entry>
</row>
<row>
<entry><type>double precision</type></entry>
<entry>8 bytes</entry>
<entry>variable-precision, inexact</entry>
<entry>15 decimal digits precision</entry>
</row>
<row>
<entry><type>smallserial</type></entry>
<entry>2 bytes</entry>
<entry>small autoincrementing integer</entry>
<entry>1 to 32767</entry>
</row>
<row>
<entry><type>serial</type></entry>
<entry>4 bytes</entry>
<entry>autoincrementing integer</entry>
<entry>1 to 2147483647</entry>
</row>
<row>
<entry><type>bigserial</type></entry>
<entry>8 bytes</entry>
<entry>large autoincrementing integer</entry>
<entry>1 to 9223372036854775807</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
The syntax of constants for the numeric types is described in
<xref linkend="sql-syntax-constants"/>. The numeric types have a
full set of corresponding