13.7.5.40 SHOW WARNINGS 声明

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

SHOW WARNINGS是诊断语句,显示有关在当前会话中执行语句所导致的条件(错误,警告和 Comments)的信息。将为 DML 语句(例如__,UPDATELOAD DATA)以及 DDL 语句(例如CREATE TABLEALTER TABLE)生成警告。

LIMIT子句的语法与SELECT语句的语法相同。参见第 13.2.9 节“ SELECT 语句”

EXPLAIN之后还使用SHOW WARNINGS来显示EXPLAIN生成的扩展信息。参见第 8.8.3 节“扩展的 EXPLAIN 输出格式”

SHOW WARNINGS显示有关由于当前会话中执行最新的非诊断语句而导致的条件的信息。如果最新的语句在解析过程中导致错误,则SHOW WARNINGS将显示结果条件,而不管语句类型(诊断或非诊断)。

显示计数(*)警告诊断语句显示错误,警告和 Comments 的总数。您还可以从warning_count系统变量中检索此数字:

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

这些语句的不同之处在于,第一个是不清除消息列 table 的诊断语句。第二个,因为它是SELECT语句,因此被认为是非诊断性的,并且确实清除了消息列 table。

相关的诊断语句SHOW ERRORS仅显示错误情况(不包括警告和 Comments),而显示计数(*)错误语句显示错误总数。参见第 13.7.5.17 节“ SHOW ERRORS 语句”GET DIAGNOSTICS可用于检查各个条件的信息。参见第 13.6.7.3 节“获取诊断声明”

这是一个简单的示例,显示INSERT的数据转换警告。该示例假定禁用了严格的 SQL 模式。启用严格模式后,警告将变为错误并终止INSERT

mysql> CREATE TABLE t1 (a TINYINT NOT NULL, b CHAR(4));
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO t1 VALUES(10,'mysql'), (NULL,'test'), (300,'xyz');
Query OK, 3 rows affected, 3 warnings (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 3

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Warning
   Code: 1265
Message: Data truncated for column 'b' at row 1
*************************** 2. row ***************************
  Level: Warning
   Code: 1048
Message: Column 'a' cannot be null
*************************** 3. row ***************************
  Level: Warning
   Code: 1264
Message: Out of range value for column 'a' at row 3
3 rows in set (0.00 sec)

max_error_count系统变量控制服务器为其存储信息的错误,警告和 Comments 消息的最大数量,从而控制SHOW WARNINGS显示的消息数量。要更改服务器可以存储的消息数,请更改max_error_count的值。默认值为 64.

max_error_count仅控制存储多少消息,而不控制计数多少。 warning_count的值不受max_error_count的限制,即使生成的消息数超过max_error_count也是如此。下面的示例演示了这一点。 ALTER TABLE语句产生三条警告消息(此示例禁用了严格的 SQL 模式,以防止在单个转换问题后发生错误)。因为max_error_count已设置为 1,所以仅存储和显示一条消息,但是所有这三个消息都被计数(如warning_count的值所示):

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, sql_mode = '';
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> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1263 | Data truncated for column 'b' at row 1 |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)

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

要禁用消息存储,请将max_error_count设置为 0.在这种情况下,warning_count仍指示发生了多少警告,但是消息未存储且无法显示。

sql_notes系统变量控制 Comments 消息是否递增warning_count以及服务器是否存储它们。默认情况下,sql_notes为 1,但是如果设置为 0,则 Comments 不会使warning_count递增,并且服务器不会存储它们:

mysql> SET sql_notes = 1;
mysql> DROP TABLE IF EXISTS test.no_such_table;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+-------+------+------------------------------------+
| Level | Code | Message                            |
+-------+------+------------------------------------+
| Note  | 1051 | Unknown table 'test.no_such_table' |
+-------+------+------------------------------------+
1 row in set (0.00 sec)

mysql> SET sql_notes = 0;
mysql> DROP TABLE IF EXISTS test.no_such_table;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW WARNINGS;
Empty set (0.00 sec)

MySQL 服务器向每个 Client 端发送一个计数,该计数指示该 Client 端执行的最新语句导致的错误,警告和 Comments 的总数。从 C API,可以通过调用mysql_warning_count()获得此值。参见第 27.7.6.78 节“ mysql_warning_count()”

mysqlClient 端中,可以分别使用warningsnowarning命令或它们的快捷方式\W\w(请参阅第 4.5.1.2 节“ mysqlClient 端命令”)来启用和禁用自动警告显示。例如:

mysql> \W
Show warnings enabled.
mysql> SELECT 1/0;
+------+
| 1/0  |
+------+
| NULL |
+------+
1 row in set, 1 warning (0.03 sec)

Warning (Code 1365): Division by 0
mysql> \w
Show warnings disabled.