暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的SQL语句 - 数据库管理语句 - SHOW 语句 - SHOW WARNINGS 语句

数据库杂货铺 2021-04-23
1906
SHOW WARNINGS 语句
 
    SHOW WARNINGS [LIMIT [offset,] row_count]
    SHOW COUNT(*) WARNINGS
     
    SHOW WARNINGS 是一个诊断语句,它显示有关在当前会话中执行语句所导致的状况(错误、警告和注释)的信息。警告是为 DML 语句(如 INSERTUPDATE LOAD DATA)以及 DDL 语句(如 CREATE TABLE ALTER TABLE)生成的。
     
    LIMIT 子句的语法与在 SELECT 语句中的语法相同。
     
    SHOW WARNINGS 还可以用在 EXPLAIN 之后,来显示 EXPLAIN 生成的扩展信息。
     
    SHOW WARNINGS 显示有关在当前会话中执行最新非诊断语句所导致的状况的信息。如果最近的语句在解析过程中导致错误,SHOW WARNINGS 将显示结果状况,而不限于语句类型(诊断或非诊断)。
     
    SHOW COUNT(*) WARNINGS 诊断语句显示错误、警告和注释的总数。还可以从 warning_count 系统变量中检索此数字:
     
      SHOW COUNT(*) WARNINGS;
      SELECT @@warning_count;
       
      这些语句的区别在于,第一个是不清除消息列表的诊断语句。第二个是 SELECT 语句,所以被认为是非诊断性的,会清除消息列表。
       
      相关的诊断语句 SHOW ERRORS 只显示错误情况(不包括警告和注释),SHOW COUNT(*) ERRORS 语句显示错误总数。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 客户端中,可以分别使用 warnings nowarning 命令或其快捷方式 \W \w,来启用和禁用自动警告显示,例如:
             
              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.
               
               
               
               
              官方文档:
              https://dev.mysql.com/doc/refman/8.0/en/show-warnings.html
               
              文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论