SHOW ERRORS

SHOW ERRORS es una sentencia de diagnóstico que muestra los errores generados por la última instrucción ejecutada en la sesión actual. Sirve para inspeccionar de forma rápida y detallada qué falló, con su código y su mensaje exacto, sin tener que reconstruir el problema a partir de la salida abreviada que a veces ofrece el cliente.

La diferencia con SHOW WARNINGS es importante y conviene tenerla clara desde el principio: SHOW WARNINGS muestra los tres niveles de diagnóstico (errores, advertencias y notas), mientras que SHOW ERRORS filtra y muestra únicamente los errores, es decir, las condiciones cuyo nivel es Error. Cuando solo te interesa lo que realmente impidió completar una operación y quieres ignorar los avisos menores, SHOW ERRORS te da justo eso. En este artículo veremos su sintaxis, cómo contar errores, y cómo se relaciona con GET DIAGNOSTICS, que es la forma de acceder a esta misma información desde dentro de un procedimiento.

Sintaxis

SHOW ERRORS admite varias formas según quieras ver todos los errores, limitar el número de filas o simplemente contarlos. La cláusula LIMIT funciona igual que en un SELECT normal.

-- Ver todos los errores
SHOW ERRORS;
 
-- Ver un número limitado
SHOW ERRORS LIMIT cantidad;
 
-- Ver con offset
SHOW ERRORS LIMIT offset, cantidad;
 
-- Contar errores
SHOW COUNT(*) ERRORS;

Hay que tener presente que esta lista se refiere siempre a la última sentencia ejecutada. En cuanto ejecutas una nueva instrucción que genera diagnósticos, la lista anterior se reemplaza, así que SHOW ERRORS debe usarse inmediatamente después de la sentencia que quieres inspeccionar.

Ejemplo básico

Veámoslo en acción. Si ejecutamos una consulta contra una tabla que no existe, MySQL genera un error; acto seguido, SHOW ERRORS nos lo muestra con todo detalle.

-- Provocar un error
-- SELECT * FROM tabla_inexistente;
-- Error: Table 'tienda_mysql.tabla_inexistente' doesn't exist
 
-- Ver el error
SHOW ERRORS;

El resultado contiene una fila por cada error de la última sentencia, con su nivel, su código numérico y su mensaje:

LevelCodeMessage
Error1146Table 'tienda_mysql.tabla_inexistente' doesn't exist

Columnas del resultado

La salida de SHOW ERRORS siempre tiene las mismas tres columnas. Conviene saber qué representa cada una para interpretar correctamente el diagnóstico.

ColumnaDescripción
LevelSiempre 'Error' para SHOW ERRORS
CodeCódigo de error numérico de MySQL
MessageTexto descriptivo del error

Como SHOW ERRORS filtra solo los errores, la columna Level mostrará siempre el valor Error. Si vieras Warning o Note, sería porque estás usando SHOW WARNINGS en su lugar.

SHOW COUNT ERRORS

Si solo te interesa saber cuántos errores produjo la última sentencia, sin ver el detalle, puedes pedir el recuento directamente. Es útil en scripts donde quieres decidir un siguiente paso según haya habido errores o no.

-- Contar errores de la última sentencia
SHOW COUNT(*) ERRORS;
@@session.error_count
1

Ese mismo número está disponible también como variable de sesión, lo que resulta cómodo cuando quieres usarlo dentro de una expresión o guardarlo en otra variable:

SELECT @@error_count;

Errores vs Warnings

Para fijar la distinción entre ambas sentencias, conviene verlas una al lado de la otra. La primera se centra en lo que falló; la segunda ofrece el panorama completo de diagnósticos.

-- SHOW ERRORS: solo errores (Level = 'Error')
SHOW ERRORS;
 
-- SHOW WARNINGS: errores + advertencias + notas (ver artículo SHOW WARNINGS)
SHOW WARNINGS;

Una buena regla práctica es usar SHOW ERRORS cuando estás depurando un fallo concreto y SHOW WARNINGS cuando quieres asegurarte de que una operación que pareció correcta no dejó avisos silenciosos por el camino, como un truncamiento de datos.

GET DIAGNOSTICS

SHOW ERRORS es una herramienta interactiva, pensada para que tú la ejecutes y leas su salida. Dentro de un procedimiento almacenado no resulta práctica, porque no puedes asignar su resultado a variables con facilidad. Para esos casos, MySQL ofrece GET DIAGNOSTICS, que extrae la misma información y la guarda en variables que tu lógica puede usar.

DELIMITER //
 
CREATE PROCEDURE diagnostico_ejemplo()
BEGIN
    DECLARE v_code INT;
    DECLARE v_msg VARCHAR(200);
    DECLARE v_count INT;
 
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
        -- Número de condiciones
        GET DIAGNOSTICS v_count = NUMBER;
 
        -- Detalle de la primera condición
        GET DIAGNOSTICS CONDITION 1
            v_code = MYSQL_ERRNO,
            v_msg = MESSAGE_TEXT;
 
        SELECT v_count AS total_condiciones,
               v_code AS codigo,
               v_msg AS mensaje;
    END;
 
    -- Provocar error
    INSERT INTO tabla_inexistente VALUES (1);
END //
 
DELIMITER ;

Dentro del handler, la primera llamada a GET DIAGNOSTICS obtiene cuántas condiciones hay, y la segunda, con CONDITION 1, recupera el código y el mensaje de la primera de ellas. Al ejecutar el procedimiento, esos datos se devuelven en una fila:

CALL diagnostico_ejemplo();
total_condicionescodigomensaje
11146Table 'tienda_mysql.tabla_inexistente' doesn't exist

Propiedades de GET DIAGNOSTICS CONDITION

GET DIAGNOSTICS CONDITION puede recuperar bastante más que el código y el mensaje. Esta tabla recoge las propiedades disponibles para cada condición, que coinciden con las que se pueden fijar al lanzar un error con SIGNAL.

PropiedadDescripción
MYSQL_ERRNOCódigo de error de MySQL
MESSAGE_TEXTMensaje descriptivo
RETURNED_SQLSTATECódigo SQLSTATE
TABLE_NAMETabla relacionada
COLUMN_NAMEColumna relacionada
SCHEMA_NAMEEsquema relacionado

Disponer de RETURNED_SQLSTATE además del código numérico es especialmente útil cuando quieres tomar decisiones portables basadas en el estándar SQL en lugar de en los códigos propios de MySQL.

error_count y max_error_count

MySQL no guarda los errores de forma ilimitada: existe un máximo de mensajes que almacena por sentencia, controlado por la variable max_error_count. Puedes consultar su valor actual para saber cuántos diagnósticos como mucho se conservarán.

-- Ver el máximo de errores que MySQL almacena
SELECT @@max_error_count;
@@max_error_count
1024

Si trabajas con operaciones masivas que pueden generar muchísimos avisos y solo te interesan unos pocos, puedes reducir este límite para la sesión y ahorrar memoria:

-- Cambiar el máximo para la sesión
SET max_error_count = 100;

Errores comunes

El malentendido más habitual es esperar que SHOW ERRORS muestre errores de sentencias anteriores. No es así: la lista se refiere exclusivamente a la última instrucción que generó diagnósticos. Si entre el error y el SHOW ERRORS ejecutas cualquier otra sentencia, perderás la información que buscabas.

Otro punto que sorprende a quien empieza es que ciertas situaciones que parecen errores se registran en realidad como advertencias o notas, y por tanto no aparecen en SHOW ERRORS. El caso clásico es un truncamiento de datos al insertar: la fila se inserta (recortada), así que MySQL lo considera una advertencia, no un error. Para verlo necesitarías SHOW WARNINGS.

Cuándo usar SHOW ERRORS

SHOW ERRORS es ideal en el trabajo interactivo con la consola de MySQL cuando estás depurando y quieres centrarte solo en lo que falló, sin el ruido de las advertencias. Para el manejo de errores dentro de procedimientos, en cambio, la opción correcta es GET DIAGNOSTICS, porque permite capturar la información en variables y actuar en consecuencia.

En el siguiente artículo veremos SHOW WARNINGS, que amplía la inspección a las advertencias y las notas además de los errores.

Limpieza

Para terminar, eliminamos el procedimiento de ejemplo.

DROP PROCEDURE IF EXISTS diagnostico_ejemplo;

Escrito por Eduardo Lázaro