SHOW WARNINGS [LIMIT [offset,] row_count]
SHOW COUNT(*) WARNINGS
SHOW WARNINGS
は、現在のセッションでのステートメントの実行の結果として得られた条件 (エラー、警告、および注意) に関する情報を表示する診断ステートメントです。 INSERT
、UPDATE
、LOAD DATA
などの DML ステートメント、および CREATE TABLE
や ALTER 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.