官方文档地址:13.7.7.42 SHOW WARNINGS Statement
SHOW WARNINGS [LIMIT [offset,] row_count]
SHOW COUNT(*) WARNINGS
SHOW WARNINGS
是一个诊断语句,用于显示由于在当前会话中执行语句而导致的情况(error
、waring
和note
)信息。DML 语句(如INSERT
、UPDATE
、LOAD DATA
)和 DDL 语句(如CREATE TABLE
、ALTER TABLE
)都会产生警告。
LIMIT
子句具有与SELECT
语句相同的语法。参见 13.2.10 SELECT 语句。
SHOW WARNINGS
也可以在EXPLAIN
后面使用,用以显示EXPLAIN
生成的扩展信息。参见 8.8.3 扩展的 EXPLAIN 输出格式。
SHOW WARNINGS
显示有关当前会话中最近执行的非诊断语句所产生的情况的信息。如果最近的语句在解析过程中导致错误,SHOW WARNINGS
将显示结果情况,而不管语句类型(诊断性或非诊断性)如何。
SHOW COUNT(*) WARNINGS
诊断语句显示error
、waring
和note
的总数。你也可以从warning_count
系统变量中检索这个数值:
SHOW COUNT(*) WARNINGS;
SELECT @@warning_count;
这些语句的不同之处在于,第一个是不清除消息列表的诊断语句。第二个语句,因为它是一个SELECT
语句,所以被认为是非诊断性的,并且会清除消息列表。
一个相关的诊断语句SHOW ERRORS
只显示error
的情况(不包括waring
和note
),SHOW COUNT(*) ERRORS
语句只显示error
总数。参见 13.7.7.17 SHOW ERRORS 语句。GET DIAGNOSTICS
语句可用于检查单个条件的信息。参见 13.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
系统变量控制服务器存储的error
、waring
和note
消息的最大数量,从而控制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
系统变量控制note
消息是否增加warning_count
值以及服务器是否存储它们。默认情况下,sql_notes
为1
,但是如果设置为0
,note
消息不会增加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 服务器向每个客户端发送一个计数,表示该客户端最近执行的语句产生的error
、waring
和note
的总数。在 C API 中,可以通过调用mysql_warning_count()
函数来获取这个值。
在mysql
客户端,您可以使用warnings
和nowarning
命令,或者它们的快捷方式,\W
和\w
来启用和禁用自动警告显示(见 4.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.