mysql.h


SHOW WARNINGS

SHOW WARNINGS [LIMIT [offset,] row_count]
SHOW COUNT(*) WARNINGS

SHOW WARNINGS muestra los mensajes de error, aviso y notas que resulten de la última sentencia que haya generado mensajes, o nada si la última sentencia que ha usado la tabla no ha generado mensajes. Esta sentencia se implementa a partir de MySQL 4.1.0. Una sentencia relacionada, SHOW ERRORS, muestra sólo los errores.

La lista de mensajes se elimina para cada nueva sentencia que use una tabla.

La sentencia SHOW COUNT(*) WARNINGS muestra el número total de errores, avisos y notas. También se puede recuperar este número a partir de la variable warning_count:

SHOW COUNT(*) WARNINGS;
SELECT @@warning_count;

El valor de warning_count puede ser mayor que el número de mensajes mostrados por SHOW WARNINGS si la variable de sistema max_error_count está asignada a un valor menor que hace que no todos los mensajes sean almancenados. Un ejemplo mostrado más abajo demuestra como puede ocurrir esto.

La cláusula LIMIT tiene la misma sintaxis que para la sentencia SELECT.

El servidor MySQL devuelve el número total de errores, avisos y notas que resulten de la última sentencia. Si se usa el API C, este valor se puede obtener mediante una llamada a la función mysql_warning_count().

Hay que tener en cuenta que el marco de trabajo para avisos se añadió en MySQL 4.1.0, en ese punto muchas sentencias no generan avisos. En 4.1.1, la situación es mucho mejor, con generación de avisos para sentencias como para LOAD DATA INFILE y sentencias DML como INSERT, UPDATE, CREATE TABLE y ALTER TABLE.

La siguiente sentecia DROP TABLE generará una nota:

mysql> DROP TABLE IF EXISTS no_such_table;
mysql> SHOW WARNINGS;
+-------+------+-------------------------------+
| Level | Code | Message                       |
+-------+------+-------------------------------+
| Note  | 1051 | Unknown table 'no_such_table' |
+-------+------+-------------------------------+

Sigue un ejemplo sencillo que miestra un aviso de sintaxis para CREATE TABLE y avisos de conversión para INSERT:

mysql> CREATE TABLE t1 (a TINYINT NOT NULL, b CHAR(4)) TYPE=MyISAM;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Warning
   Code: 1287
Message: 'TYPE=storage_engine' is deprecated, use
         'ENGINE=storage_engine' instead
1 row in set (0.00 sec)

mysql> INSERT INTO t1 VALUES(10,'mysql'),(NULL,'test'),
    -> (300,'Open Source');
Query OK, 3 rows affected, 4 warnings (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 4

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Warning
   Code: 1265
Message: Data truncated for column 'b' at row 1
*************************** 2. row ***************************
  Level: Warning
   Code: 1263
Message: Data truncated, NULL supplied to NOT NULL column 'a' at row 2
*************************** 3. row ***************************
  Level: Warning
   Code: 1264
Message: Data truncated, out of range for column 'a' at row 3
*************************** 4. row ***************************
  Level: Warning
   Code: 1265
Message: Data truncated for column 'b' at row 3
4 rows in set (0.00 sec)

El número máximo de mensajes de error, aviso y notas a almacenar se controlan mediante la variable de sistema max_error_count. Por defecto, su valor es 64. Para cambiar el número de mensajes que se quieren almacenar, modificar el valor de max_error_count. En el siguiente ejemplo, la sentencia ALTER TABLE produce tres avisos, pero sólo uno se almacena porque el valor de max_error_count se ha puesto a 1:

mysql> SHOW VARIABLES LIKE 'max_error_count';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_error_count | 64    |
+-----------------+-------+
1 row in set (0.00 sec)

mysql> SET max_error_count=1;
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE t1 MODIFY b CHAR;
Query OK, 3 rows affected, 3 warnings (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 3

mysql> SELECT @@warning_count;
+-----------------+
| @@warning_count |
+-----------------+
|               3 |
+-----------------+
1 row in set (0.01 sec)

mysql> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1263 | Data truncated for column 'b' at row 1 |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)

Para desactivar los avisos, asignar 0 a max_error_count. En ese caso, warning_count sigue indicando cuantos avisos se han producido, pero no se almacena ningún mensaje.