SHOW WARNINGS [LIMIT [offset,] row_count]
SHOW COUNT(*) WARNINGS
SHOW WARNINGS
是一个诊断语句,用于显示有关当前会话中执行语句所产生的条件(错误、警告和提示)的信息。警告针对 DML 语句(例如 INSERT
、UPDATE
和 LOAD DATA
)以及 DDL 语句(例如 CREATE TABLE
和 ALTER TABLE
)生成。
LIMIT
子句的语法与 SELECT
语句的语法相同。请参阅 第 15.2.13 节,“SELECT 语句”。
SHOW WARNINGS
还在 EXPLAIN
之后使用,以显示由 EXPLAIN
生成的扩展信息。请参阅 第 10.8.3 节,“扩展 EXPLAIN 输出格式”。
SHOW WARNINGS
显示有关当前会话中最近一次非诊断语句执行所产生的条件的信息。如果最近一次语句在解析期间导致错误,则无论语句类型(诊断或非诊断)如何,SHOW WARNINGS
会显示所产生的条件。
SHOW COUNT(*) WARNINGS
诊断语句显示错误、警告和提示的总数。您也可以从 warning_count
系统变量中检索此数字。
SHOW COUNT(*) WARNINGS;
SELECT @@warning_count;
这些语句之间的区别在于,第一个是诊断语句,它不会清除消息列表。第二个,因为它是一个 SELECT
语句,被认为是非诊断语句,它会清除消息列表。
相关的诊断语句,SHOW ERRORS
,只显示错误条件(它不包括警告和提示),而 SHOW COUNT(*) ERRORS
语句显示错误的总数。参见 第 15.7.7.18 节,“SHOW ERRORS 语句”。 GET DIAGNOSTICS
可用于检查各个条件的信息。参见 第 15.6.7.3 节,“GET DIAGNOSTICS 语句”。
以下是一个简单的示例,显示了针对 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
系统变量控制服务器存储信息的错误、警告和提示消息的最大数量,从而控制 SHOW WARNINGS
显示的消息数量。要更改服务器可以存储的消息数量,请更改 max_error_count
的值。
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 | 1024 |
+-----------------+-------+
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
系统变量控制提示消息是否会增加 warning_count
以及服务器是否会存储提示消息。默认情况下,sql_notes
为 1,但如果设置为 0,提示消息不会增加 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 服务器向每个客户端发送一个计数,指示该客户端执行的最近一次语句所产生的错误、警告和提示的总数。从 C API,可以通过调用 mysql_warning_count()
来获取此值。参见 mysql_warning_count()。
在 mysql 客户端中,可以使用 warnings
和 nowarning
命令(或它们的快捷方式 \W
和 \w
)分别启用和禁用自动警告显示(参见 第 6.5.1.2 节,“mysql 客户端命令”)。例如
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.