SHOW WARNINGS [LIMIT [offset,] row_count]
SHOW COUNT(*) WARNINGS
SHOW WARNINGS
是一個診斷語句,用於顯示目前會話中執行語句所產生的條件(錯誤、警告和注意事項)相關資訊。警告會針對 DML 語句(例如 INSERT
、UPDATE
和 LOAD DATA
)以及 DDL 語句(例如 CREATE TABLE
和 ALTER TABLE
)而產生。
LIMIT
子句的語法與 SELECT
語句相同。請參閱 第 15.2.13 節〈SELECT 語句〉。
SHOW WARNINGS
也會在 EXPLAIN
之後使用,以顯示 EXPLAIN
產生的延伸資訊。請參閱 第 10.8.3 節〈延伸 EXPLAIN 輸出格式〉。
SHOW WARNINGS
會顯示目前會話中最近執行的非診斷語句所產生的條件相關資訊。如果最近的語句在剖析期間產生錯誤,SHOW WARNINGS
會顯示產生的條件,無論語句類型為何(診斷或非診斷)。
SHOW COUNT(*) WARNINGS
診斷語句會顯示錯誤、警告和注意事項的總數。您也可以從 warning_count
系統變數中擷取此數字。
SHOW COUNT(*) WARNINGS;
SELECT @@warning_count;
這些語句之間的差異在於,第一個是診斷語句,不會清除訊息清單。第二個語句因為是 SELECT
語句,因此會被視為非診斷語句,並且會清除訊息清單。
相關的診斷語句 SHOW ERRORS
只會顯示錯誤條件(排除警告和注意事項),而 SHOW COUNT(*) ERRORS
語句會顯示錯誤的總數。請參閱 第 15.7.7.18 節〈SHOW ERRORS 語句〉。GET DIAGNOSTICS
可用於檢查個別條件的資訊。請參閱 第 15.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
只控制儲存的訊息數量,而不控制計算的訊息數量。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_warning_count()。
在 mysql 用戶端中,您可以使用 warnings
和 nowarning
命令或其捷徑 \W
和 \w
分別啟用和停用自動警告顯示(請參閱 第 6.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.