Con matemáticas de precisión, los números con valores exactos
se usan tal y como se dan cuando es posible. Por ejemplo, números
en comparaciones se usan exactamente como se dan sin cambiar su
valor. En modo SQL estricto, para un INSERT
en
una columna con un tipo exacto (DECIMAL
o
entero), se inserta un número con su valor exacto si está dentro
del rango de la columna. Cuando se recibe, el valor debe ser el
mismo que se insertó. (Sin modo estricto, se permite truncar para
INSERT
.)
El tratamiento de expresiones numéricas depende de qué clase de valores contiene la expresión:
-
Si hay presente algún valor aproximado, la expresión es aproximada y se evalúa usando aritmética de punto flotante.
-
Si no hay presente ningún valor aproximado, la expresión contiene sólo valores exactos. Si algún valor exacto contiene una parte fraccional ( un valor a continuación del punto decimal), la expresión se evalúa usando aritmética exacta
DECIMAL
y una precisión de 64 dígitos. ("Exacto" esta sujeto a los límites de lo que puede representarse en binario.1.0/3.0
puede representarse como.333...
con un número finito de dígitos, no como "exactamente un tercio", así que(1.0/3.0)*3.0
no se evalúa como "exactamente 1.0.") -
En otro caso, la expresión contiene sólo valores enteros. La expresión es exacta y evaluada usando aritmética entera y tiene la misma precisión que
BIGINT
(64 bits).
Si una expresión numérica contiene cualquier cadena de carácteres, se convierten a valores de coma flotante y doble precisión y la expresión es aproximada.
Las inserciones en columnas numéricas están afectadas por el
modo SQL, controlada por la varible de sistema sql_mode. (Consulte
Sección 1.7.2, “Selección de modos SQL”.) La siguiente discusión menciona el
modo estricto (seleccionado por los valores de modo
STRICT_ALL_TABLES
o
STRICT_TRANS_TABLES
) y
ERROR_FOR_DIVISION_BY_ZERO
. Para activar todas
las restricciones, puede usar el modo
TRADITIONAL
, que incluye tanto el modo estricto
como ERROR_FOR_DIVISION_BY_ZERO
:
mysql> SET sql_mode='TRADITIONAL';
Si se inserta un número en una columna de tipo exacto
(DECIMAL
o entero), debe insertarse con su
valor exacto si está dentro del rango de la columna.
Si el valor tiene demasiados dígitos en la parte fraccional, se redondea y se genera una advertencia. El redondeo se hace como se describe en "Comportamiento del redondeo".
Si el valor tiene demasiados dígitos en la parte entera, es demasiado grande y se trata como se explica a continuación:
-
Si el modo estricto no está activado, el valor se trunca al valor legal más cercano y se genera una advertencia.
-
Si el modo estricto está activo, se genera un error de desbordamiento.
Desbordamiento inferior no se deteca, así que su tratamiento no está definido.
Por defecto, la división por cero produce un resultado de
NULL
y ninguna advertencia. Con el modo SQL
ERROR_FOR_DIVISION_BY_ZERO
activado, MySQL
trata la división por cero de forma distinta:
-
Si el modo estricto no está activo, aparece una advertencia.
-
Si el modo estricto está activo, las inserciones y actualizaciones con divisiones por cero están prohibidas y ocurre un error.
En otras palabras, inserciones y actualizaciones que impliquen
expresiones que realizan divisiones por cero pueden tratarse como
errores, pero esto requiere
ERROR_FOR_DIVISION_BY_ZERO
además del modo
estricto.
Suponga que tenemos este comando:
INSERT INTO t SET i = 1/0;
Esto es lo que ocurre al combinar modo estricto y
ERROR_FOR_DIVISION_BY_ZERO
:
sql_mode Valor
|
Resultado |
''
|
No advertencia, no error, i es NULL |
strict | No advertencia, no error, i es NULL |
ERROR_FOR_DIVISION_BY_ZERO
|
Advertencia, no error, i es NULL |
strict,ERROR_FOR_DIVISION_BY_ZERO |
Error, no se inserta el registro |
Para inserciones de cadenas de carácteres en columnas numéricas, las conversiones de cadenas a números se tratan como se muestra si la cadena tiene contenido no numérico:
-
Una cadena que no comienza con un número no puede usarse como número y produce un error en modo estricto, o una advertencia en otro caso. Esto incluye la cadena vacía.
-
Una cadena que comienza con un número puede convertirse, pero se trunca la parte no numérica final. Esto produce un error en modo estricto, o una advertencia en otro caso.