文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  SHOW WARNINGS 語法

15.7.7.41 SHOW WARNINGS 語法

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

SHOW WARNINGS 是一個診斷語法,會顯示目前工作階段中執行語法所產生的條件 (錯誤、警告和注意事項) 的相關資訊。警告會在 DML 語法 (例如 INSERTUPDATELOAD DATA) 以及 DDL 語法 (例如 CREATE TABLEALTER TABLE) 產生。

LIMIT 子句的語法與 SELECT 語法相同。請參閱 第 15.2.13 節,「SELECT 語法」

在執行 EXPLAIN 之後,也可以使用 SHOW WARNINGS 來顯示 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 客戶端中,您可以使用 warningsnowarning 命令(或它們的快捷方式 \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.