13.21.3 Expression Handling

With precision math, exact-value numbers are used as given
whenever possible. For example, numbers in comparisons are used
exactly as given without a change in value. In strict SQL mode,
for INSERT into a column with an
exact data type (DECIMAL or
integer), a number is inserted with its exact value if it is
within the column range. When retrieved, the value should be the
same as what was inserted. (If strict SQL mode is not enabled,
truncation for INSERT is
permissible.)

Handling of a numeric expression depends on what kind of values
the expression contains:

If any approximate values are present, the expression is
approximate and is evaluated using floating-point arithmetic.

If no approximate values are present, the expression contains
only exact values. If any exact value contains a fractional
part (a value following the decimal point), the expression is
evaluated using DECIMAL exact
arithmetic and has a precision of 65 digits. The term
“exact” is subject to the limits of what can be
represented in binary. For example, 1.0/3.0
can be approximated in decimal notation as
.333..., but not written as an exact
number, so (1.0/3.0)*3.0 does not evaluate
to exactly 1.0.

Otherwise, the expression contains only integer values. The
expression is exact and is evaluated using integer arithmetic
and has a precision the same as
BIGINT (64 bits).

If a numeric expression contains any strings, they are converted
to double-precision floating-point values and the expression is
approximate.

If the value has too many digits in the integer part, it is too
large and is handled as follows:

If strict mode is not enabled, the value is truncated to the
nearest legal value and a warning is generated.

If strict mode is enabled, an overflow error occurs.

Underflow is not detected, so underflow handling is undefined.

For inserts of strings into numeric columns, conversion from
string to number is handled as follows if the string has
nonnumeric contents:

A string that does not begin with a number cannot be used as a
number and produces an error in strict mode, or a warning
otherwise. This includes the empty string.

A string that begins with a number can be converted, but the
trailing nonnumeric portion is truncated. If the truncated
portion contains anything other than spaces, this produces an
error in strict mode, or a warning otherwise.

By default, division by zero produces a result of
NULL and no warning. By setting the SQL mode
appropriately, division by zero can be restricted.