MySQL 出錯時反饋的代碼代表出錯的原因,我們只有明白這些代碼代表的意思,才能了解 MySQL 數據庫的錯誤,找出原因,解決問題。下面介紹 MySQL 服務器和客戶端中的錯誤代碼、提示消息的生成方式和查看方法,最后還對 MySQL 中常見的錯誤代碼做了詳細說明。
## MySQL服務器端錯誤代碼和消息
MySQL 是根據安裝目錄下 share 中的 errmsg.txt 文件來生成 include 下 mysqld\_error.h 和 mysqld\_ername.h 中的錯誤定義的。另外,SQLSTATE 的值也是根據 share 下 errmsg.txt 文件中的內容來生成 include 下的 sql\_state.h 的。
默認情況下,服務器出錯代碼都是以 1 開頭的,例如“1004 SQLSTATE: HY000 (ER\_CANT\_CREATE\_FILE)”,該消息的錯誤代碼為 1004,表示“無法創建文件”。
errmsg.txt 文件的部分內容如下:
~~~
#define ER_NO_SUCH_TABLE 1146
"Table '%-.64s.%-.64s' doesn't exist",
#define ER_NONEXISTING_TABLE_GRANT 1147
"There is no such grant defined for user '%-.32s' on host '%-.64s' on table '%-.64s'",
#define ER_NOT_ALLOWED_COMMAND 1148
"The used command is not allowed with this MySQL version",
#define ER_SYNTAX_ERROR 1149
"You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use",
#define ER_DELAYED_CANT_CHANGE_LOCK 1150
"Delayed insert thread couldn't get requested lock for table %-.64s",
#define ER_TOO_MANY_DELAYED_THREADS 1151
"Too many delayed threads in use",
~~~
文件中包含的`%d`和`%ld`代表數值,`%s`代表字符串。顯示具體信息時,它們將被消息值取代。
例如,錯誤代碼為 1146 的錯誤信息在 share 下的 errmsg.txt 中顯示為“Table '%-.192s.%-.192s' doesn't exist",即“表' '%-.192s.%-.192s"不存在”。其中“%-.192s”可表示左對齊 192 個字符寬度,可理解為此處輸出為占位字符串,在顯示具體信息時回避字符串消息替換。
#### 例 1
切換 test 數據庫,查詢數據庫下有哪些數據表,SQL 語句和執行過程如下:
~~~
mysql> USE test;
Database changed
mysql> SHOW tables;
+-------------------+
| Tables_in_test |
+-------------------+
| tb_eventtest |
| tb_student |
| tb_student2 |
| tb_student3 |
| tb_student_course |
| tb_students_info |
+-------------------+
6 rows in set (0.01 sec)
~~~
查詢數據表 tb\_student 中的記錄,SQL 語句和執行過程如下:
~~~
mysql> SELECT * FROM tb_student;
+----+--------+
| id | name |
+----+--------+
| 1 | Java |
| 2 | MySQL |
| 3 | Python |
+----+--------+
3 rows in set (0.06 sec)
~~~
查詢數據表 tb\_oldstudent 中的記錄,SQL 語句和運行結果如下:
mysql> SELECT \* FROM tb\_oldstudent;
ERROR 1146 (42S02): Table 'test.tb\_oldstudent' doesn't exist
由結果可以看出,在 test 數據庫中不存在 tb\_oldstudent 數據庫,服務器錯誤代碼為 1146。
## MySQL客戶端錯誤代碼和消息
MySQL 是根據安裝目錄下 include 中的 errmsg.h 文件來生成錯誤代碼的。
errmsg.h 文件的部分內容如下:
~~~
#define CR_NAMEDPIPESETSTATE_ERROR 2018
#define CR_CANT_READ_CHARSET 2019
#define CR_NET_PACKET_TOO_LARGE 2020
#define CR_EMBEDDED_CONNECTION_2021
#define CR_PROBE_SLAVE_STATUS 2022
#define CR_PROBE_SLAVE_HOSTS 2023
#define CR_PROBE_SLAVE_CONNECT 2024
#define CR_PROBE_MASTER_CONNECT 2025
#define CR_SSL_CONNECTION_ERROR 2026
#define CR_MALFORMED_PACKET 2027
#define CR_WRONG_LICENSE 2028
~~~
文件中`%d`和`%s`分別代表數值和字符串,和服務器端錯誤代碼顯示方式一樣,在顯示時它們將被消息值取代。
默認情況下,客戶端出錯代碼都是以 2 開頭的,例如錯誤代碼為 2025(CR\_PROBE\_MASTER\_CONNECT)的,表示連接到主服務器時出錯。
## 常見錯誤代碼
常見的服務器錯誤代碼及說明如下表所示:
| 錯誤代碼 | 說? 明 |
| --- | --- |
| 1004 | 無法創建文件 |
| 1005 | 無法創建數據表、創建表失敗 |
| 1006? | 無法創建數據庫、創建數據庫失敗 |
| 1007 | 無法創建數據庫,數據庫己存在 |
| 1008? | 無法刪除數據庫,數據庫不存在 |
| 1009 | 不能刪除數據庫文件導致刪除數據庫失敗 |
| 1010? | 不能刪除數據目錄導致刪除數據庫失敗 |
| 1011 | 刪除數據庫文件時出錯 |
| 1012 | 無法讀取系統表中的記錄 |
| 1013 | 無法獲取的狀態 |
| 1014 | 無法獲得工作目錄 |
| 1015 | 無法鎖定文件 |
| 1016 | 無法打開文件 |
| 1017 | 無法找到文件 |
| 1018 | 無法讀取的目錄 |
| 1019 | 無法為更改目錄 |
| 1020 | 記錄已被其它用戶修改 |
| 1021 | 硬盤剩余空間不足,請加大硬盤可用空間 |
| 1022 | 關鍵詞重讀,更改記錄失敗 |
| 1023 | 關閉時發生錯誤 |
| 1025 | 更改名字時發生錯誤 |
| 1032 | 記錄不存在 |
| 1036 | 數據表是只讀的,不能對它進行修改 |
| 1037 | 系統內存不足,請重啟數據庫或重啟服務器 |
| 1042 | 無效的主機名 |
| 1044 | 當前用戶沒有訪問數據庫的權限 |
| 1045 | 不能連接數據庫,用戶名或密碼錯誤 |
常見的客戶端錯誤代碼及說明如下所示:
| 錯誤代碼 | 說? 明 |
| --- | --- |
| 2000 | 未知 MySQL 錯誤 |
| 2001 | 不能創建 UNIX 套接字(%d) |
| 2002 | 不能通過套接字“ %s”(%d)連接到本地 MySQL 服務器, self 服務未啟動 |
| 2003 | 不能連接到 %s ”(%d )上的 MySQL 服務器,未啟動 mysql 服務 |
| 2004 | 不能創建 TCP/IP 接字(%d) |
| 2005 | 未知的 MySQL 服務器主機“ %s”(%d) |
| 2007 | 協議不匹配,服務器版本=%d,客戶端版本=%d |
| 2008 | MySQL 客戶端內存溢出 |
| 2009 | 錯誤的主機信息 |
| 2010 | 通過 UNIX 套接字連接的本地主機 |
| 2012 | 服務器握手過程中出錯 |
| 2013 | 查詢過程中丟失了與 SQL 服務器的連接 |
| 2014 | 命令不同步,現在不能運行該命令 |
| 2024 | 連接到從服務器時出錯 |
| 2025 | 連接到主服務器時出錯 |
| 2026 | SSL 連接錯誤 |
- 數據庫入門
- 1.常用的數據庫
- 2.數據管理技術的3個發展階段
- 3.數據庫是什么?關系型數據庫和非關系型數據庫又是什么?
- 4.為什么要使用數據庫?
- 5.數據庫系統是什么?它由哪幾部分組成?
- 6.常用數據庫訪問接口簡介
- 7.數據庫的種類有哪些?
- 8.幾種常用的數據庫
- 9.MySQL是什么
- 10.MySQL適用于哪些場景?
- 11.學MySQL前,需要了解這些數據庫專業術語
- 12.MySQL客戶端和服務器架構(C/S架構)
- 13.明白了MySQL內部結構才能成為高手!
- 14.如何學習數據庫(新手必看)?
- 15.小白學習MySQL需要多長時間,能從事哪方面的工作?
- 16.當前市場對數據庫程序員的需求如何?待遇如何?
- 17.DBA到底要做什么,成為一名DBA需要具備什么能力?
- 一、數據庫的概念和常用工具
- 二、MySQL規范、配置及登錄退出操作
- 三、MySQL中的數據類型
- 四、數據庫增查改刪等操作
- 五、數據表增查改刪操作
- 六、MySQL數據增查改刪操作
- 七、MySQL存儲引擎
- 八、MySQL常用函數
- MySQL的安裝和配置
- 1.MySQL 5.7的新特性(新功能)
- 2.MySQL下載步驟詳解
- 3.MySQL安裝配置教程(Windows系統)
- 4.MySQL免安裝版配置教程
- 5.MySQL配置環境變量
- 6.安裝MySQL后,如何判斷是否已安裝成功
- 7.啟動MySQL服務的兩種方式(圖解)
- 8.登錄MySQL數據庫
- 9.對Linux MySQL軟件包的一些說明
- 10.Linux CentOS卸載MySQL(Linux安裝MySQL前的準備)
- 11.Linux安裝配置MySQL詳細步驟
- 12.MySQL my.cnf配置文件詳解
- 13.MySQL常用圖形化管理工具
- 14.MySQL安裝后的目錄結構介紹
- 15.MySQL數據庫文件存放目錄結構詳解
- 16.MySQL配置文件(my.ini)詳解
- 17.與其它數據庫不同,MySQL可以在不同的SQL模式下運行
- 18.MySql Command Line Client閃退原因及解決方案
- MySQL數據庫的基本操作
- 1.SQL是什么?它能做什么?
- 2.SQL的基本書寫規則
- 3.MySQL查看或顯示數據庫(SHOW DATABASES語句)
- 4.MySQL創建數據庫(CREATE DATABASE語句)
- 5.MySQL修改數據庫:ALTER DATABASE用法簡介
- 6.MySQL刪除數據庫(DROP DATABASE語句)
- 7.MySQL選擇數據庫(MySQL USE語句)
- 8.MySQL注釋:單行注釋和多行注釋
- 9.MySQL中SQL語句的大小寫規則
- 10.如何查看MySQL系統幫助?
- 11.看懂SQL錯誤代碼,提高學習效率!
- 數據庫高級
- 一、視圖的操作
- 二、觸發器的操作
- 三、事務的操作
- 四、索引的操作
- 五、存儲過程的操作
- 六、數據庫的優化方案
- 1.分庫、分表和索引
- 2.讀寫分離和查詢優化
- 3.join代替子查詢
- 4.盡量使用短小的事務
- 5.常用小技巧
- MySQL使用注意事項
- 1.字符亂碼及連接驅動