Press CTRL+C to copySHOW 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
系统变量中检索此数字。
Press CTRL+C to copySHOW 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
。
Press CTRL+C to copymysql> 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
仅控制存储多少条消息,而不控制统计多少条消息。即使生成的消息数量超过 max_error_count
,warning_count
的值也不受 max_error_count
的限制。以下示例对此进行了演示。ALTER TABLE
语句会生成三条警告消息(示例中禁用了严格 SQL 模式,以防止在出现单个转换问题后发生错误)。由于 max_error_count
已设置为 1,因此只有一条消息被存储和显示,但所有三条消息都被统计在内(如 warning_count
的值所示)。
Press CTRL+C to copymysql> 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
,并且服务器不会存储它们。
Press CTRL+C to copymysql> 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 客户端命令”)。例如:
Press CTRL+C to copymysql> \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.