SHOW WARNINGS [LIMIT [offset,] row_count]
SHOW COUNT(*) WARNINGS
SHOW WARNINGS
は、現在のセッションでのステートメントの実行の結果として得られた条件 (エラー、警告、および注意) に関する情報を表示する診断ステートメントです。警告は、INSERT
、UPDATE
、LOAD DATA INFILE
などの DML ステートメントのほか、CREATE TABLE
や ALTER TABLE
などの DDL ステートメントに対して生成されます。
LIMIT
句の構文は、SELECT
ステートメントの場合と同じです。セクション13.2.9「SELECT 構文」を参照してください。
SHOW WARNINGS
はまた、EXTENDED
キーワードが使用されている EXPLAIN
によって生成された追加の情報を表示するために、EXPLAIN EXTENDED
のあとにも使用されます。セクション8.8.3「EXPLAIN EXTENDED 出力フォーマット」を参照してください。
SHOW WARNINGS
は、メッセージを生成した、現在のセッションでの最新のステートメントの結果として得られた条件に関する情報を表示します。最新のステートメントがテーブルを使用し、メッセージを生成しなかった場合は、何も表示しません。(つまり、テーブルを使用するが、メッセージを生成しないステートメントはメッセージリストをクリアします。) テーブルを使用せず、メッセージを生成しないステートメントは、メッセージリストに影響を与えません。
SHOW COUNT(*) WARNINGS
診断ステートメントは、エラー、警告、および注意の総数を表示します。この数はまた、warning_count
システム変数からも取得できます。
SHOW COUNT(*) WARNINGS;
SELECT @@warning_count;
関連する診断ステートメント SHOW ERRORS
はエラー状態のみ (警告と注意は除外されます) を表示し、SHOW COUNT(*) ERRORS
ステートメントはエラーの総数を表示します。セクション13.7.5.18「SHOW ERRORS 構文」を参照してください。GET DIAGNOSTICS
を使用すると、個々の条件に関する情報を検査できます。セクション13.6.7.3「GET DIAGNOSTICS 構文」を参照してください。
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
の値を変更します。デフォルトは 64 です。
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 | 64 |
+-----------------+-------+
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()
を呼び出すことによって取得できます。セクション23.7.7.73「mysql_warning_count()」を参照してください。