本節討論錯誤訊息如何在 MySQL 中產生,以及其包含的元素。
錯誤訊息可能源自伺服器端或用戶端。
在伺服器端,錯誤訊息可能在啟動和關閉過程中發生,或是在 SQL 陳述式執行期間發生的問題所導致。
MySQL 伺服器會將一些錯誤訊息寫入其錯誤日誌。這些訊息指出資料庫管理員感興趣的問題,或需要 DBA 採取行動的問題。
伺服器會將其他錯誤訊息傳送給用戶端程式。這些訊息指出僅與特定用戶端相關的問題。MySQL 用戶端程式庫會取得從伺服器接收的錯誤,並讓主機用戶端程式可以使用這些錯誤。
用戶端錯誤訊息是在 MySQL 用戶端程式庫中產生,通常涉及與伺服器通訊的問題。
寫入錯誤日誌的伺服器端錯誤訊息範例
此訊息在啟動過程中產生,提供狀態或進度指標
2018-10-28T13:01:32.735983Z 0 [Note] [MY-010303] [Server] Skipping generation of SSL certificates as options related to SSL are specified.
此訊息指出需要 DBA 採取行動的問題
2018-10-02T03:20:39.410387Z 768 [ERROR] [MY-010045] [Server] Event Scheduler: [evtuser@localhost][myschema.e_daily] Unknown database 'mydb'
傳送至用戶端程式的伺服器端錯誤訊息範例,如 mysql 用戶端所顯示
mysql> SELECT * FROM no_such_table;
ERROR 1146 (42S02): Table 'test.no_such_table' doesn't exist
源自用戶端程式庫的用戶端錯誤訊息範例,如 mysql 用戶端所顯示
$> mysql -h no-such-host
ERROR 2005 (HY000): Unknown MySQL server host 'no-such-host' (-2)
無論錯誤是源自用戶端程式庫還是從伺服器接收,MySQL 用戶端程式可能會以不同的方式回應。如剛才所示,用戶端可能會顯示錯誤訊息,以便使用者可以採取更正措施。用戶端可能會在內部嘗試解決或重試失敗的操作,或採取其他動作。
當發生錯誤時,錯誤資訊包含數個元素:錯誤代碼、SQLSTATE 值和訊息字串。這些元素具有下列特性:
錯誤代碼:此值為數值。它是 MySQL 特有的,無法移植到其他資料庫系統。
每個錯誤編號都有對應的符號值。範例:
伺服器錯誤編號
1146
的符號為ER_NO_SUCH_TABLE
。用戶端錯誤編號
2005
的符號為CR_UNKNOWN_HOST
。
錯誤訊息中使用的錯誤代碼集會分割成不同的範圍;請參閱 錯誤代碼範圍。
錯誤代碼在給定 MySQL 系列的正式發行 (GA) 版本中是穩定的。在系列達到 GA 狀態之前,新的代碼可能仍在開發中,且可能會變更。
SQLSTATE 值:此值為五個字元的字串 (例如,
'42S02'
)。SQLSTATE 值取自 ANSI SQL 和 ODBC,且比數值錯誤代碼更標準化。SQLSTATE 值的前兩個字元表示錯誤類別:類別 =
'00'
表示成功。類別 =
'01'
表示警告。類別 =
'02'
表示 「找不到」。這與游標的內容相關,用於控制當游標到達資料集結尾時發生的情況。當SELECT ... INTO
陳述式未擷取任何資料列時,也會發生此情況。var_list
類別 >
'02'
表示例外狀況。
對於伺服器端錯誤,並非所有 MySQL 錯誤編號都有對應的 SQLSTATE 值。在這些情況下,會使用
'HY000'
(一般錯誤)。對於用戶端錯誤,SQLSTATE 值一律為
'HY000'
(一般錯誤),因此它對於區分不同的用戶端錯誤沒有意義。訊息字串:此字串提供錯誤的文字說明。
錯誤訊息中使用的錯誤代碼集會分割成不同的範圍,每個範圍都有其用途:
1 到 999:全域錯誤代碼。此錯誤代碼範圍稱為 「全域」,因為它是伺服器和用戶端共用的範圍。
當此範圍中的錯誤源自伺服器端時,伺服器會將它寫入錯誤日誌,並以六位數的前導零填補錯誤代碼,並加上
MY-
前置詞。當此範圍中的錯誤源自用戶端時,用戶端程式庫會將它提供給用戶端程式,而不會使用零填補或前置詞。
1,000 到 1,999:保留給傳送至用戶端的訊息的伺服器錯誤代碼。
2,000 到 2,999:保留給用戶端程式庫使用的用戶端錯誤代碼。
3,000 到 4,999:保留給傳送至用戶端的訊息的伺服器錯誤代碼。
5,000 到 5,999:保留給 X 外掛程式用於傳送至用戶端的訊息的錯誤代碼。
10,000 到 49,999:保留給寫入錯誤日誌 (不傳送至用戶端) 的訊息的伺服器錯誤代碼。
當此範圍中發生錯誤時,伺服器會將它寫入錯誤日誌,並以六位數的前導零填補錯誤代碼,並加上
MY-
前置詞。50,000 到 51,999:保留給第三方使用的錯誤代碼。
伺服器處理寫入錯誤日誌的錯誤訊息的方式與傳送至用戶端的錯誤訊息不同: