ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
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 连接错误 |