linkend="datatype-money-table"/>. The fractional precision is
determined by the database's <xref linkend="guc-lc-monetary"/> setting.
The range shown in the table assumes there are two fractional digits.
Input is accepted in a variety of formats, including integer and
floating-point literals, as well as typical
currency formatting, such as <literal>'$1,000.00'</literal>.
Output is generally in the latter form but depends on the locale.
</para>
<table id="datatype-money-table">
<title>Monetary 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>money</type></entry>
<entry>8 bytes</entry>
<entry>currency amount</entry>
<entry>-92233720368547758.08 to +92233720368547758.07</entry>
</row>
</tbody>
</tgroup>
</table>
<para>
Since the output of this data type is locale-sensitive, it might not
work to load <type>money</type> data into a database that has a different
setting of <varname>lc_monetary</varname>. To avoid problems, before
restoring a dump into a new database make sure <varname>lc_monetary</varname> has
the same or equivalent value as in the database that was dumped.
</para>
<para>
Values of the <type>numeric</type>, <type>int</type>, and
<type>bigint</type> data types can be cast to <type>money</type>.
Conversion from the <type>real</type> and <type>double precision</type>
data types can be done by casting to <type>numeric</type> first, for
example:
<programlisting>
SELECT '12.34'::float8::numeric::money;
</programlisting>
However, this is not recommended. Floating point numbers should not be
used to handle money due to the potential for rounding errors.
</para>
<para>
A <type>money</type> value can be cast to <type>numeric</type> without
loss of precision. Conversion to other types could potentially lose
precision, and must also be done in two stages:
<programlisting>
SELECT '52093.89'::money::numeric::float8;
</programlisting>
</para>
<para>
Division of a <type>money</type> value by an integer value is performed
with truncation of the fractional part towards zero. To get a rounded
result, divide by a floating-point value, or cast the <type>money</type>
value to <type>numeric</type> before dividing and back to <type>money</type>
afterwards. (The latter is preferable to avoid risking precision loss.)
When a <type>money</type> value is divided by another <type>money</type>
value, the result is <type>double precision</type> (i.e., a pure number,
not money); the currency units cancel each other out in the division.
</para>
</sect1>
<sect1 id="datatype-character">
<title>Character Types</title>
<indexterm zone="datatype-character">
<primary>character string</primary>
<secondary>data types</secondary>
</indexterm>
<indexterm>
<primary>string</primary>
<see>character string</see>
</indexterm>
<indexterm zone="datatype-character">
<primary>character</primary>
</indexterm>
<indexterm zone="datatype-character">
<primary>character varying</primary>
</indexterm>
<indexterm zone="datatype-character">
<primary>text</primary>
</indexterm>
<indexterm zone="datatype-character">
<primary>char</primary>
</indexterm>
<indexterm zone="datatype-character">
<primary>varchar</primary>
</indexterm>
<indexterm zone="datatype-character">
<primary>bpchar</primary>
</indexterm>
<table id="datatype-character-table">
<title>Character Types</title>