MySQL 錯誤分為 伺服器端 (Server) 與 客戶端 (Client) 兩大類:
share/errmsg.txt,對應 include/mysqld_error.h、sql_state.h。include/errmsg.h、libmysql/errmsg.c。每筆錯誤包含:Error Code、SQLSTATE、Symbol、Message (含 %d %s 佔位符)。
| Code | SQLSTATE | 常見訊息 | 典型原因/處置 |
|---|---|---|---|
| 1005 | HY000 | Can't create table (errno: 150) | 外鍵建立失敗 → 檢查引擎、字符集、型別、索引 |
| 1007 | HY000 | Can't create database; database exists | 建庫重名 → IF NOT EXISTS 或先 DROP |
| 1008 | HY000 | Can't drop database; database doesn't exist | 刪除不存在的庫 |
| 1022 | 23000 | Duplicate key | 唯一鍵衝突 → 檢查業務邏輯或 INSERT IGNORE/ON DUPLICATE KEY |
| 1032 | HY000 | Key not found | InnoDB 找不到記錄,可能頁面損壞或並發刪除 |
| 1040 | 08004 | Too many connections | 連線數達 max_connections → 擴大參數或連線池洩漏 |
| 1044 | 42000 | Access denied for user to database | 權限不足 → GRANT 對應庫/表 |
| 1045 | 28000 | Access denied (using password: YES/NO) | 帳號/密碼/主機不匹配 → 檢查 mysql.user Host 欄位 |
| 1049 | 42000 | Unknown database | 庫名拼錯或未建立 |
| 1050 | 42S01 | Table already exists | 建表重名 → IF NOT EXISTS |
| 1051 | 42S02 | Unknown table | 表名拼錯、大小寫敏感 (Linux) 或表已刪除 |
| 1054 | 42S22 | Unknown column | 欄位名拼錯或 ALTER TABLE 未同步 |
| 1062 | 23000 | Duplicate entry for key | 主鍵/唯一鍵重複 → 業務去重或自增衝突 |
| 1064 | 42000 | SQL syntax error near '...' | 語法錯誤 → 對照版本手冊,注意保留字需反引號 |
| 1093 | HY000 | Can't specify target table for update in FROM clause | 同表子查詢更新 → 用衍生表包裹 SELECT * FROM (SELECT ...) AS t |
| 1114 | HY000 | Table is full | 磁碟滿、InnoDB 表空間滿、innodb_data_file_path 無 autoextend |
| 1130 | HY000 | Host is not allowed to connect | 遠程連線未授權 → GRANT ... TO user@'%' 或指定 IP |
| 1146 | 42S02 | Table doesn't exist | 同 1051,常見於拼寫或大小寫 |
| 1153 | 08S01 | Got a packet bigger than max_allowed_packet | 封包過大 → 調大 max_allowed_packet |
| 1175 | HY000 | Safe update mode: WHERE required with KEY column | sql_safe_updates=ON 禁止無 WHERE 更新 → 加 WHERE 或關閉選項 |
| 1194 | HY000 | Table marked as crashed, should be repaired | MyISAM 表損壞 → REPAIR TABLE 或 myisamchk |
| 1205 | HY000 | Lock wait timeout exceeded | 行鎖等待超時 innodb_lock_wait_timeout → 檢查長事務、索引缺失 |
| 1213 | 40001 | Deadlock found, try restarting transaction | 死鎖 → 固定加鎖順序、縮短事務、降低隔離級別 |
| 1215 | HY000 | Cannot add foreign key constraint | 同 1005,詳見外鍵排查清單 |
| 1226 | 42000 | User has exceeded resource limits | 帳號資源上限 (MAX_QUERIES_PER_HOUR 等) → 調整或重置 |
| 1292 | 22007 | Truncated incorrect value | 型別轉換失敗 (如字串存日期) → 清洗資料、修正型別 |
| 1317 | 70100 | Query execution was interrupted | KILL QUERY 或 max_execution_time 觸發 |
| 1364 | HY000 | Field doesn't have a default value | NOT NULL 無預設值欄位未給值 → 設 DEFAULT 或應用層補值 |
| 1366 | HY000 | Incorrect value for column | 資料不符合欄位定義 (編碼、ENUM、範圍) |
| 1406 | 22001 | Data too long for column | 字串超過 VARCHAR/TEXT 定義長度 → 截斷或擴大欄位 |
| 1418 | HY000 | Function lacks DETERMINISTIC/NO SQL/READS SQL DATA | 建函數需宣告特性或開啟 log_bin_trust_function_creators=1 |
| 1449 | HY000 | The user specified as definer does not exist | View/Trigger/Event 定義者帳號已刪 → 重建或 ALTER DEFINER |
| 1451 | 23000 | Cannot delete or update parent row (FK) | 父表記錄被子表參照 → 先處理子表或 ON DELETE CASCADE |
| 1452 | 23000 | Cannot add or update child row (FK) | 子表外鍵值在父表不存在 → 檢查資料完整性 |
| Code | Symbol | 訊息 | 處置 |
|---|---|---|---|
| 2002 | CR_CONNECTION_ERROR | Can't connect to local MySQL server through socket | Socket 路徑錯、服務未啟、權限 |
| 2003 | CR_CONN_HOST_ERROR | Can't connect to MySQL server on 'host' | 遠程連線被拒 → bind-address、防火牆、帳號 Host |
| 2006 | CR_SERVER_GONE_ERROR | MySQL server has gone away | 長連線斷開、封包過大、Server 重啟、超時 |
| 2013 | CR_SERVER_LOST | Lost connection to MySQL server during query | 查詢執行中斷 → 檢查網路、超時、OOM |
| 2014 | CR_COMMANDS_OUT_OF_SYNC | Commands out of sync | 多結果集未處理完 → mysql_next_result 或關閉游標 |
| 2020 | CR_NET_PACKET_TOO_LARGE | Packet larger than max_allowed_packet | 同 1153,調大參數 |
| 2026 | CR_SSL_CONNECTION_ERROR | SSL connection error | 憑證/協議不匹配 → 驗證 ssl_ca、ssl_cert、TLS 版本 |
| 2049 | CR_SECURE_AUTH | Connection using old auth protocol refused | 舊密碼雜湊 → 升級帳號密碼 ALTER USER ... IDENTIFIED WITH caching_sha2_password |
-- 伺服器端:查看完整清單 (需源碼或官網)
-- 客戶端:perror 工具解釋系統錯誤號
perror 28 -- 輸出: OS error code 28: No space left on device
-- 程式中獲取
SELECT @@version; -- 確認版本對應錯誤清單
收藏此對照表,遇到報錯秒定位,大幅縮短排查時間。