MySQL 8.0 リファレンスマニュアル


13.7.7.42 SHOW WARNINGS ステートメント

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

SHOW WARNINGS は、現在のセッションでのステートメントの実行の結果として得られた条件 (エラー、警告、および注意) に関する情報を表示する診断ステートメントです。 INSERTUPDATELOAD DATA などの DML ステートメント、および CREATE TABLEALTER TABLE などの DDL ステートメントに対して警告が生成されます。

LIMIT 句の構文は、SELECT ステートメントの場合と同じです。 セクション13.2.10「SELECT ステートメント」を参照してください。

SHOW WARNINGS は、EXPLAIN によって生成された拡張情報を表示するために、EXPLAIN の後にも使用されます。 セクション8.8.3「拡張 EXPLAIN 出力形式」を参照してください。

SHOW WARNINGS では、現行のセッションで最新の非診断ステートメントを実行した結果の条件に関する情報が表示されます。 解析中に最新のステートメントでエラーが発生した場合、SHOW WARNINGS では、ステートメントのタイプ (診断または非診断) に関係なく、結果の条件が表示されます。

SHOW COUNT(*) WARNINGS 診断ステートメントは、エラー、警告、および注意の総数を表示します。 この数はまた、warning_count システム変数からも取得できます。

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

これらのステートメントの違いは、最初のステートメントがメッセージリストをクリアしない診断ステートメントであることです。 もう一方は SELECT ステートメントであるため、非診断とみなされ、メッセージリストはクリアされます。

関連する診断ステートメント SHOW ERRORS はエラー状態のみ (警告と注意は除外されます) を表示し、SHOW COUNT(*) ERRORS ステートメントはエラーの総数を表示します。 セクション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 システム変数は、サーバーが情報を格納する対象となるエラー、警告、および注意メッセージの最大数、したがって SHOW WARNINGS が表示するメッセージの数を制御します。 サーバーが格納できるメッセージの数を変更するには、max_error_count の値を変更します。

max_error_count は、カウントされるメッセージの数ではなく、格納されるメッセージの数のみを制御します。 生成されたメッセージの数が max_error_count を超えた場合でも、warning_count の値は max_error_count によって制限されません。 この点について次の例で説明します。 この ALTER TABLE ステートメントは、3 つの警告メッセージを生成します (この例では、変換の問題が 1 つ発生したあとにエラーが発生しないように、厳密な SQL モードが無効になっています)。 max_error_count が 1 に設定されたため、格納されて表示されたメッセージは 1 つだけですが、warning_count の値で示されているように 3 つすべてがカウントされています。

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 クライアントでは、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.

関連キーワード:  ステートメント, CREATE, TABLE, count, DROP, WARNINGS, warning, メッセージ, row, サブクエリー