23.3. Manejo de expresiones

MySQL 5.0

23.3. Manejo de expresiones

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 en una columna con un tipo exacto ( 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 .)

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 y una precisión de 64 dígitos. ("Exacto" esta sujeto a los límites de lo que puede representarse en binario. puede representarse como con un número finito de dígitos, no como "exactamente un tercio", así que 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 (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 o ) y . Para activar todas las restricciones, puede usar el modo , que incluye tanto el modo estricto como :

mysql> SET sql_mode='TRADITIONAL';

Si se inserta un número en una columna de tipo exacto ( 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 y ninguna advertencia. Con el modo SQL 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 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 :

Valor Resultado
No advertencia, no error, i es
strict No advertencia, no error, i es
Advertencia, no error, i es
strict, 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.