Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

15.7.7.44 显示警告语句

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

显示警告 是一个诊断语句,显示当前会话中执行语句所生成的条件(错误、警告和注意)信息。警告是为 DML 语句生成的,如 插入更新加载数据,以及 DDL 语句,如 创建表修改表

LIMIT 子句的语法与 选择 语句相同。见 第 15.2.13 节,“选择语句”

显示警告 也用于 解释 之后,显示由 解释 生成的扩展信息。见 第 10.8.3 节,“扩展解释输出格式”

显示警告 显示当前会话中最近一条非诊断语句的执行结果信息。如果最近一条语句在解析时出错,显示警告 将显示结果信息,无论语句类型(诊断或非诊断)。

The 显示 COUNT(*) 警告 诊断语句显示错误、警告和注意的总数。你也可以从 warning_count 系统变量中检索该数字:

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

这两个语句之间的区别在于,第一个是诊断语句,不清除消息列表。第二个,因为它是一个 选择 语句,被认为是非诊断语句,并清除消息列表。

一个相关的诊断语句,显示错误,只显示错误条件(排除警告和注意),而 显示 COUNT(*) 错误 语句显示错误的总数。见 第 15.7.7.18 节,“显示错误语句”获取诊断信息 可以用于检查单个条件的信息。见 第 15.6.7.3 节,“获取诊断信息语句”

以下是一个简单的示例,显示 插入 的数据转换警告。该示例假设严格 SQL 模式已禁用。在严格模式下,警告将变为错误并终止 插入

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)

The max_error_count 系统变量控制服务器存储的错误、警告和注意信息的最大数量,从而控制 显示警告 显示的消息数量。要更改服务器可以存储的消息数量,请更改 max_error_count 的值。

最大错误计数 只控制存储的消息数量,而不是计数的数量。警告计数 的值不受 最大错误计数 的限制,即使生成的消息数量超过 最大错误计数。以下示例演示了这一点。ALTER TABLE 语句生成三个警告消息(严格 SQL 模式被禁用,以防止单个转换问题后出现错误)。只有一个消息被存储和显示,因为 最大错误计数 被设置为 1,但所有三个都被计数(如 警告计数 的值所示):

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)

要禁用消息存储,请将 最大错误计数 设置为 0。在这种情况下,警告计数 仍然指示警告的数量,但消息不被存储且无法显示。

系统变量 sql_notes 控制是否将注意消息计入 警告计数 以及服务器是否存储它们。默认情况下,sql_notes 为 1,但如果设置为 0,注意消息不计入 警告计数,服务器也不存储它们:

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.