13.7.7.42 SHOW WARNINGS 语句

官方文档地址:13.7.7.42 SHOW WARNINGS Statement


SHOW WARNINGS [LIMIT [offset,] row_count]

SHOW COUNT(*) WARNINGS

SHOW WARNINGS是一个诊断语句,用于显示由于在当前会话中执行语句而导致的情况(errorwaringnote)信息。DML 语句(如INSERTUPDATELOAD DATA)和 DDL 语句(如CREATE TABLEALTER TABLE)都会产生警告。

LIMIT子句具有与SELECT语句相同的语法。参见 13.2.10 SELECT 语句

SHOW WARNINGS也可以在EXPLAIN后面使用,用以显示EXPLAIN生成的扩展信息。参见 8.8.3 扩展的 EXPLAIN 输出格式

SHOW WARNINGS显示有关当前会话中最近执行的非诊断语句所产生的情况的信息。如果最近的语句在解析过程中导致错误,SHOW WARNINGS将显示结果情况,而不管语句类型(诊断性或非诊断性)如何。

SHOW COUNT(*) WARNINGS诊断语句显示errorwaringnote的总数。你也可以从warning_count系统变量中检索这个数值:

SHOW COUNT(*) WARNINGS;

SELECT @@warning_count;

这些语句的不同之处在于,第一个是不清除消息列表的诊断语句。第二个语句,因为它是一个SELECT语句,所以被认为是非诊断性的,并且会清除消息列表。

一个相关的诊断语句SHOW ERRORS只显示error的情况(不包括waringnote),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系统变量控制服务器存储的errorwaringnote消息的最大数量,从而控制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_notes1,但是如果设置为0note消息不会增加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 服务器向每个客户端发送一个计数,表示该客户端最近执行的语句产生的errorwaringnote的总数。在 C API 中,可以通过调用mysql_warning_count()函数来获取这个值。

mysql客户端,您可以使用warningsnowarning命令,或者它们的快捷方式,\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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值