當使用任何主機語言呼叫 MySQL 時,都可能遇到各類錯誤。本文系統整理了 MySQL 伺服器錯誤代碼與客戶端錯誤代碼,供開發人員快速查找、診斷問題。
伺服器錯誤資訊來源於原始碼檔案 share/errmsg.txt。該檔案中的「%d」與「%s」分別代表數值與字串佔位符,實際顯示時會被具體數值取代。錯誤值、SQLSTATE 值亦由此檔案生成至 include/mysqld_error.h、include/mysqld_ername.h、include/sql_state.h 等標頭檔。因版本更新頻繁,實際錯誤代碼可能超出本列表範圍。
| 錯誤碼 | SQLSTATE | 符號常數 | 錯誤訊息範例 |
|---|---|---|---|
| 1000 | HY000 | ER_HASHCHK | hashchk |
| 1004 | HY000 | ER_CANT_CREATE_FILE | 無法建立檔案 '%s' (errno: %d) |
| 1005 | HY000 | ER_CANT_CREATE_TABLE | 無法建立資料表 '%s' (errno: %d) |
| 1007 | HY000 | ER_DB_CREATE_EXISTS | 無法建立資料庫 '%s',資料庫已存在 |
| 1016 | HY000 | ER_CANT_OPEN_FILE | 無法開啟檔案:'%s' (errno: %d) |
| 1021 | HY000 | ER_DISK_FULL | 磁碟已滿 (%s);等待釋放空間… |
| 1022 | 23000 | ER_DUP_KEY | 無法寫入;重複資料表 '%s' 的鍵值 |
| 1032 | HY000 | ER_KEY_NOT_FOUND | 在 '%s' 中找不到記錄 |
| 1040 | 08004 | ER_CON_COUNT_ERROR | 連線數過多 |
| 1044 | 42000 | ER_DBACCESS_DENIED_ERROR | 拒絕用戶 '%s'@'%s' 存取資料庫 '%s' |
| 1045 | 28000 | ER_ACCESS_DENIED_ERROR | 拒絕用戶 '%s'@'%s' 的存取(使用密碼:%s) |
| 1049 | 42000 | ER_BAD_DB_ERROR | 未知資料庫 '%s' |
| 1050 | 42S01 | ER_TABLE_EXISTS_ERROR | 資料表 '%s' 已存在 |
| 1051 | 42S02 | ER_BAD_TABLE_ERROR | 未知資料表 '%s' |
| 1054 | 42S22 | ER_BAD_FIELD_ERROR | '%s' 中未知欄位 '%s' |
| 1062 | 23000 | ER_DUP_ENTRY | 鍵 %d 的重複條目 '%s' |
| 1064 | 42000 | ER_PARSE_ERROR | 第 %d 行,%s 附近 '%s' 有語法錯誤 |
| 1093 | HY000 | ER_UPDATE_TABLE_USED | 無法在 FROM 子句中指定要更新的目標資料表 '%s' |
| 1114 | HY000 | ER_RECORD_FILE_FULL | 資料表 '%s' 已滿 |
| 1129 | HY000 | ER_HOST_IS_BLOCKED | 因連線錯誤過多,主機 '%s' 被封鎖;請用 'mysqladmin flush-hosts' 解封 |
| 1146 | 42S02 | ER_NO_SUCH_TABLE | 資料表 '%s.%s' 不存在 |
| 1153 | 08S01 | ER_NET_PACKET_TOO_LARGE | 封包大於 'max_allowed_packet' 位元組 |
| 1175 | HY000 | ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE | 安全更新模式下,嘗試不使用 WHERE 條件更新含 KEY 欄位的資料表 |
| 1193 | HY000 | ER_UNKNOWN_SYSTEM_VARIABLE | 未知系統變數 '%s' |
| 1205 | HY000 | ER_LOCK_WAIT_TIMEOUT | 鎖定等待逾時;請嘗試重新啟動事務 |
| 1213 | 40001 | ER_LOCK_DEADLOCK | 嘗試獲取鎖定時發現死結;請嘗試重新啟動事務 |
| 1215 | HY000 | ER_CANNOT_ADD_FOREIGN | 無法新增外鍵約束 |
| 1216 | 23000 | ER_NO_REFERENCED_ROW | 無法新增或更新子列:外鍵約束失敗 |
| 1217 | 23000 | ER_ROW_IS_REFERENCED | 無法刪除或更新父列:外鍵約束失敗 |
| 1226 | 42000 | ER_USER_LIMIT_REACHED | 用戶 '%s' 已超出 '%s' 資源限制(目前值:%ld) |
| 1264 | 22003 | ER_WARN_DATA_OUT_OF_RANGE | 第 %ld 列 '%s' 的值超出範圍已被調整 |
| 1290 | HY000 | ER_OPTION_PREVENTS_STATEMENT | MySQL 以 %s 選項運行,無法執行該陳述式 |
| 1292 | 22007 | ER_TRUNCATED_WRONG_VALUE | 截斷了不正確的 %s 值: '%s' |
| 1317 | 70100 | ER_QUERY_INTERRUPTED | 查詢執行被中斷 |
| 1364 | HY000 | ER_NO_DEFAULT_FOR_FIELD | 欄位 '%s' 沒有預設值 |
| 1365 | 22012 | ER_DIVISION_BY_ZERO | 除以零 |
| 1396 | HY000 | ER_CANNOT_USER | 對 %s 的操作 %s 失敗 |
| 1406 | 22001 | ER_DATA_TOO_LONG | 第 %ld 列 '%s' 的資料過長 |
| 1418 | HY000 | ER_BINLOG_UNSAFE_ROUTINE | 該預存程序未聲明 DETERMINISTIC/NO SQL/READS SQL DATA,且二進位日誌已啟用 |
| 1442 | HY000 | ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG | 無法在預存函數/觸發器中更新已被呼叫語句使用的資料表 '%s' |
| 1451 | 23000 | ER_ROW_IS_REFERENCED_2 | 無法刪除或更新父列:外鍵約束失敗 (%s) |
| 1452 | 23000 | ER_NO_REFERENCED_ROW_2 | 無法新增或更新子列:外鍵約束失敗 (%s) |
註:完整代碼表包含 1000~1494 號共 400 餘條錯誤,上表僅列舉高頻項目。完整清單請參考 MySQL 官方文件或原始碼 share/errmsg.txt。
客戶端錯誤定義於 include/errmsg.h 與 libmysql/errmsg.c。以下為常見客戶端錯誤:
| 錯誤碼 | 符號常數 | 錯誤訊息範例 |
|---|---|---|
| 2000 | CR_UNKNOWN_ERROR | 未知 MySQL 錯誤 |
| 2002 | CR_CONNECTION_ERROR | 無法透過 socket '%s' (%d) 連線到本地 MySQL 伺服器 |
| 2003 | CR_CONN_HOST_ERROR | 無法連線到 '%s' (%d) 上的 MySQL 伺服器 |
| 2006 | CR_SERVER_GONE_ERROR | MySQL 伺服器已離線 |
| 2008 | CR_OUT_OF_MEMORY | MySQL 客戶端記憶體不足 |
| 2012 | CR_SERVER_HANDSHAKE_ERR | 伺服器握手過程出錯 |
| 2013 | CR_SERVER_LOST | 查詢過程中失去與 MySQL 伺服器的連線 |
| 2014 | CR_COMMANDS_OUT_OF_SYNC | 指令不同步;目前無法執行該指令 |
| 2020 | CR_NET_PACKET_TOO_LARGE | 接收封包大於 'max_allowed_packet' 位元組 |
| 2026 | CR_SSL_CONNECTION_ERROR | SSL 連線錯誤 |
| 2027 | CR_MALFORMED_PACKET | 畸形封包 |
| 2049 | CR_SECURE_AUTH | 拒絕使用舊認證協定(4.1.1 之前)的連線(啟用了 client 'secure_auth' 選項) |
| 2054 | CR_NOT_IMPLEMENTED | 該功能尚未實作 |
perror 錯誤碼 可獲取系統層級錯誤說明。error.log 記錄了啟動、關閉、異常崩潰等關鍵事件。max_allowed_packet、max_connections、innodb_lock_wait_timeout 緩解。