15.7.7.41 显示警告语句
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.