Tenga cuidado al usar el tipo de datos UNSIGNED en el cuerpo de la subrutina, parte 2

10 de agosto de 2010

En una de nuestras publicaciones, en la sección "Cuidado al usar el tipo de datos UNSIGNED en el cuerpo de la subrutina", explicamos cómo obtener datos no válidos en el cuerpo de la subrutina cuando se usa el tipo de datos UNSIGNED y que en este caso MySQL no crea cualquier excepción.

Una posible solución a este problema es establecer explícitamente el modo NO_UNSIGNED_SUBTRACTION, como se muestra en el ejemplo de la documentación de MySQL.

Cambiemos el script habitual:

SET SQL_MODE = 'NO_UNSIGNED_SUBTRACTION';
DROP PROCEDURE IF EXISTS tinyintunsigned_to_tinyint;
DELIMITER $
CREATE PROCEDURE tinyintunsigned_to_tinyint()
BEGIN
    DECLARE v_TINYINT TINYINT;
-- Range for v_TINYINT :         -128 .. 0 .. 127
    DECLARE v_TINYINTUNSIGNED TINYINT UNSIGNED;
-- Range for v_TINYINTUNSIGNED :         0 .. 255
    SET SQL_MODE = 'NO_UNSIGNED_SUBTRACTION';
    SET v_TINYINTUNSIGNED = 250;
-- ===============================
    SET v_TINYINT = v_TINYINTUNSIGNED;
-- ===============================
    SELECT v_TINYINT, v_TINYINTUNSIGNED;
END$
DELIMITER ;
SET SQL_MODE = 'NO_UNSIGNED_SUBTRACTION';
CALL tinyintunsigned_to_tinyint;

E intente ejecutarlo en dbForge Studio para MySQL:

Desbordamiento: como resultado obtenemos un número negativo

Desbordamiento: como resultado obtenemos un número negativo

Como puede ver en los resultados, en este caso MySQL maneja incorrectamente la asignación del número.

Cambiemos de nuevo el escenario habitual. Pero en este caso le asignaremos a la variable v_TINYINT un valor que supera el valor máximo posible permitido para este tipo de datos:

-- ===============================
--  SET v_TINYINT = v_TINYINTUNSIGNED;
    SET v_TINYINT = 250;
-- ===============================

Aquí está el resultado de la ejecución normal:

Slicing: como resultado obtendremos el máximo número posible para este tipo

Slicing: como resultado obtendremos el máximo número posible para este tipo

Como puede ver, en este caso el procedimiento también se realizó sin errores ni advertencias.
Por lo tanto, trate de usar el tipo de datos UNSIGNED lo menos posible en cuerpos normales.

¿Qué piensas de eso? ¿Utiliza el tipo de datos UNSIGNED en sus procedimientos?

Artículos de interés

Subir