Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


15.7.7.41 显示警告语句

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

SHOW WARNINGS 是一个诊断语句,用于显示在当前会话中执行语句时产生的条件(错误、警告和说明)的信息。警告是在执行 DML 语句(如INSERTUPDATELOAD DATA)以及 DDL 语句(如CREATE TABLEALTER 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 客户端中,可以使用 warningsnowarning 命令(分别)或它们的快捷方式 \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.