《MySQL Reference Manual》→ Appendix B. Error Codes and Messages,含完整錯誤碼、SQLSTATE、訊息對照表,適合離線查閱。
網址:https://dev.mysql.com/doc/refman/5.7/en/error-handling.html(依版本調整 5.6/5.7/8.0)
優勢:永遠同步最新版本、可搜尋、含 SQLSTATE 對照。
安裝 MySQL 後自帶於 bin/ 目錄:
# Linux/macOS
/usr/local/mysql/bin/perror 10 127 134
# Windows
C:\Program Files\MySQL\MySQL Server 5.7\bin\perror.exe 10 127 134
$ perror 10 127 134
Error code 10: No child processes
Error code 127: Network is down
Error code 134: Transport endpoint is not connected
支援一次查詢多個代碼,腳本整合極便利。
| 代碼 | SQLSTATE | 訊息 | 典型原因 |
|---|---|---|---|
| 1005 | HY000 | Can't create table | 外鍵定義錯誤、磁碟滿、權限 |
| 1007 | HY000 | Database exists | CREATE DATABASE 未加 IF NOT EXISTS |
| 1045 | 28000 | Access denied | 帳號/密碼錯誤、Host 不匹配、權限表損壞 |
| 1062 | 23000 | Duplicate entry | 主鍵/唯一鍵衝突 |
| 1146 | 42S02 | Table doesn't exist | 拼寫錯誤、大小寫敏感、Schema 錯誤 |
| 1205 | HY000 | Lock wait timeout | 長事務、索引缺失、死鎖 |
| 1213 | 40001 | Deadlock found | 並發更新同一記錄、不同順序鎖表 |
| 2006 | HY000 | MySQL server has gone away | 封包過大、超時、服務重啟 |
| 2013 | HY000 | Lost connection during query | 網路抖動、查詢過慢觸發 timeout |
public enum MySQLErrorCode {
ER_CANT_CREATE_TABLE(1005, "Can't create table"),
ER_DB_CREATE_EXISTS(1007, "Database exists"),
ER_DUP_ENTRY(1062, "Duplicate entry"),
ER_LOCK_WAIT_TIMEOUT(1205, "Lock wait timeout"),
ER_DEADLOCK(1213, "Deadlock found"),
ER_SERVER_GONE(2006, "MySQL server has gone away"),
ER_LOST_CONNECTION(2013, "Lost connection during query");
private final int code;
private final String msg;
MySQLErrorCode(int code, String msg) { this.code = code; this.msg = msg; }
public static String getMsg(int code) {
for (MySQLErrorCode e : values()) if (e.code == code) return e.msg;
return "Unknown error code: " + code;
}
}
遇到 MySQL 錯誤碼,**首選 perror 秒級定義**,次查線上文檔確認 SQLSTATE 與版本差異,最後將高頻錯誤碼封裝為專案常見異常類,實現「錯誤碼 → 業務語義」的自動轉譯,加速排錯。