The `DECIMAL`

and `NUMERIC`

types store exact numeric data values. These types are used when
it is important to preserve exact precision, for example with
monetary data. In MySQL, `NUMERIC`

is
implemented as `DECIMAL`

, so the following
remarks about `DECIMAL`

apply equally to
`NUMERIC`

.

As of MySQL 5.0.3, `DECIMAL`

values are stored
in binary format. Previously, they were stored as strings, with
one character used for each digit of the value, the decimal
point (if the scale is greater than 0), and the
“`-`

” sign (for negative numbers).
See Section 12.17, “Precision Math”.

In a `DECIMAL`

column declaration, the
precision and scale can be (and usually is) specified; for
example:

salary DECIMAL(5,2)

In this example, `5`

is the precision and
`2`

is the scale. The precision represents the
number of significant digits that are stored for values, and the
scale represents the number of digits that can be stored
following the decimal point.

Standard SQL requires that `DECIMAL(5,2)`

be
able to store any value with five digits and two decimals, so
values that can be stored in the `salary`

column range from `-999.99`

to
`999.99`

. MySQL enforces this limit as of MySQL
5.0.3. Before 5.0.3, on the positive end of the range, the
column could actually store numbers up to
`9999.99`

. (For positive numbers, MySQL 5.0.2
and earlier used the byte reserved for the sign to extend the
upper end of the range.)

In standard SQL, the syntax
`DECIMAL(`

is
equivalent to
* M*)

`DECIMAL(``M`

,0)

.
Similarly, the syntax `DECIMAL`

is equivalent
to `DECIMAL(``M`

,0)

,
where the implementation is permitted to decide the value of
`M`

`DECIMAL`

syntax. The default
value of `M`

If the scale is 0, `DECIMAL`

values contain no
decimal point or fractional part.

The maximum number of digits for `DECIMAL`

is
65 (64 from MySQL 5.0.3 to 5.0.5). Before MySQL 5.0.3, the
maximum range of `DECIMAL`

values is the same
as for `DOUBLE`

, but the actual range for a
given `DECIMAL`

column can be constrained by
the precision or scale for a given column. When such a column is
assigned a value with more digits following the decimal point
than are permitted by the specified scale, the value is
converted to that scale. (The precise behavior is operating
system-specific, but generally the effect is truncation to the
permissible number of digits.)