SHOW WARNINGS

SHOW WARNINGS muestra los errores, advertencias y notas generados por la última sentencia ejecutada. Es más completo que SHOW ERRORS porque incluye los tres niveles de diagnóstico.

Sintaxis

-- Ver todas las advertencias
SHOW WARNINGS;
 
-- Limitar resultados
SHOW WARNINGS LIMIT cantidad;
 
-- Con offset
SHOW WARNINGS LIMIT offset, cantidad;
 
-- Contar advertencias
SHOW COUNT(*) WARNINGS;

Niveles de diagnóstico

LevelDescripciónEjemplo
ErrorLa operación fallóTabla no existe
WarningLa operación se completó pero con problemasDato truncado
NoteInformación adicionalDROP IF EXISTS de objeto inexistente

Ejemplo: advertencia por truncamiento

CREATE TEMPORARY TABLE tmp_test (nombre VARCHAR(5));
INSERT INTO tmp_test VALUES ('MySQL Tutorial');
-- Warning: Data truncated for column 'nombre'
 
SHOW WARNINGS;
LevelCodeMessage
Warning1265Data truncated for column 'nombre' at row 1
SELECT * FROM tmp_test;
nombre
MySQL

El dato se insertó pero truncado a 5 caracteres.

DROP TEMPORARY TABLE tmp_test;

Ejemplo: nota con IF EXISTS

DROP TABLE IF EXISTS tabla_que_no_existe;
-- Query OK, 0 rows affected, 1 warning
 
SHOW WARNINGS;
LevelCodeMessage
Note1051Unknown table 'tienda_mysql.tabla_que_no_existe'

No es un error ni una advertencia, solo una nota informativa.

warning_count

-- Variable de sesión con el conteo
SELECT @@warning_count;
-- Equivalente
SHOW COUNT(*) WARNINGS;

sql_notes

La variable sql_notes controla si MySQL genera notas:

-- Desactivar notas
SET sql_notes = 0;
 
DROP TABLE IF EXISTS tabla_inexistente;
SHOW WARNINGS;
-- (vacío, no se generó la nota)
 
-- Reactivar
SET sql_notes = 1;

Advertencias comunes

CódigoMensajeCausa
1265Data truncatedDato más largo que la columna
1366Incorrect valueTipo de dato incompatible
1292Truncated incorrect valueConversión implícita con pérdida
1051Unknown tableDROP IF EXISTS de tabla inexistente
1305PROCEDURE does not existDROP PROCEDURE IF EXISTS
3719utf8 is alias for utf8mb3Usar utf8 en vez de utf8mb4

Usar SHOW WARNINGS en procedimientos

DELIMITER //
 
CREATE PROCEDURE operacion_con_warnings()
BEGIN
    DECLARE v_warnings INT;
 
    -- Operación que puede generar warnings
    DROP TABLE IF EXISTS tmp_no_existe;
 
    -- Verificar si hubo warnings
    SELECT @@warning_count INTO v_warnings;
 
    IF v_warnings > 0 THEN
        SELECT CONCAT('Se generaron ', v_warnings, ' advertencia(s)') AS info;
    END IF;
END //
 
DELIMITER ;

SHOW WARNINGS vs GET DIAGNOSTICS

CaracterísticaSHOW WARNINGSGET DIAGNOSTICS
UsoInteractivo, en el clienteDentro de procedimientos
Nivel de detalleBásicoCompleto, con más propiedades
Acceso programáticoDifícilFácil, con variables

Para manejo de errores dentro de procedimientos, GET DIAGNOSTICS es más adecuado:

DELIMITER //
 
CREATE PROCEDURE ejemplo_diagnostics()
BEGIN
    DECLARE v_count INT;
 
    DECLARE CONTINUE HANDLER FOR SQLWARNING
    BEGIN
        GET DIAGNOSTICS v_count = NUMBER;
        SELECT CONCAT(v_count, ' advertencia(s) capturada(s)') AS info;
    END;
 
    -- Operación que genera warning
    DROP TABLE IF EXISTS otra_tabla_inexistente;
END //
 
DELIMITER ;

Limpieza

DROP PROCEDURE IF EXISTS operacion_con_warnings;
DROP PROCEDURE IF EXISTS ejemplo_diagnostics;

Con esto completamos la sección de manejo de errores. Hemos cubierto DECLARE HANDLER, DECLARE CONDITION, SIGNAL, RESIGNAL, SHOW ERRORS y SHOW WARNINGS. En la siguiente sección exploraremos las funciones almacenadas.

Escrito por Eduardo Lázaro