This section discusses the characteristics of the
DECIMAL data type (and its
synonyms), with particular regard to the following topics:
Maximum number of digits
Storage format
Storage requirements
The nonstandard MySQL extension to the upper range of
DECIMAL columns
Possible incompatibilities with applications that are written for older versions of MySQL (prior to 5.0.3) are noted throughout this section.
The declaration syntax for a
DECIMAL column is
DECIMAL(.
The ranges of values for the arguments are as follows:
M,D)
M is the maximum number of digits
(the precision). It has a range of 1 to 65. (Older versions of
MySQL permitted a range of 1 to 254.)
D is the number of digits to the
right of the decimal point (the scale). It has a range of 0 to
30 and must be no larger than M.
The maximum value of 65 for M means
that calculations on DECIMAL values
are accurate up to 65 digits. This limit of 65 digits of precision
also applies to exact-value numeric literals, so the maximum range
of such literals differs from before. (In older versions of MySQL,
decimal values could have up to 254 digits. However, calculations
were done using floating-point and thus were approximate, not
exact.)
Values for DECIMAL columns are
stored using a binary format that packs nine decimal digits into 4
bytes. The storage requirements for the integer and fractional
parts of each value are determined separately. Each multiple of
nine digits requires 4 bytes, and any remaining digits left over
require some fraction of 4 bytes. The storage required for
remaining digits is given by the following table.
| Leftover Digits | Number of Bytes |
|---|---|
| 0 | 0 |
| 1–2 | 1 |
| 3–4 | 2 |
| 5–6 | 3 |
| 7–9 | 4 |
For example, a DECIMAL(18,9) column has nine
digits on either side of the decimal point, so the integer part
and the fractional part each require 4 bytes. A
DECIMAL(20,6) column has fourteen integer
digits and six fractional digits. The integer digits require four
bytes for nine of the digits and 3 bytes for the remaining five
digits. The six fractional digits require 3 bytes.
Unlike some older versions of MySQL,
DECIMAL columns in MySQL
5.5 do not store a leading +
character or - character or leading
0 digits. If you insert
+0003.1 into a DECIMAL(5,1)
column, it is stored as 3.1. For negative
numbers, a literal - character is not stored.
Applications that rely on the older behavior must be modified to
account for this change.
DECIMAL columns do not permit
values larger than the range implied by the column definition. For
example, a DECIMAL(3,0) column supports a range
of -999 to 999. A
DECIMAL(
column permits at most M,D)M -
D digits to the left of the decimal
point. This is not compatible with applications relying on older
versions of MySQL that permitted storing an extra digit in lieu of
a + sign.
The SQL standard requires that the precision of
NUMERIC(
be exactly M,D)M
digits. For
DECIMAL(,
the standard requires a precision of at least
M,D)M digits but permits more. In MySQL,
DECIMAL(
and
M,D)NUMERIC(
are the same, and both have a precision of exactly
M,D)M digits.
For a full explanation of the internal format of
DECIMAL values, see the file
strings/decimal.c in a MySQL source
distribution. The format is explained (with an example) in the
decimal2bin() function.
For more detailed information about porting applications that rely
on the old treatment of the DECIMAL
data type, see the MySQL 5.0 Reference
Manual.