错误消息可以来自服务器端或客户端,每个错误消息包括错误代码、SQLSTATE 值和消息字符串,如 第 B.1 节,“错误消息来源和元素”所述。有关服务器端、客户端和全局(服务器和客户端共享)错误的列表,请参阅 MySQL 8.3 错误消息参考。
在程序中进行错误检查时,请使用错误代码数字或符号,而不是错误消息字符串。消息字符串不经常更改,但它可能会更改。此外,如果数据库管理员更改语言设置,那将影响消息字符串的语言;请参阅 第 12.12 节,“设置错误消息语言”。
MySQL 中的错误信息可在服务器错误日志、SQL 级别、客户端程序和命令行中获得。
在服务器端,一些消息旨在写入错误日志。有关配置服务器写入日志的位置和方式的信息,请参阅 第 7.4.2 节,“错误日志”。
其他服务器错误消息旨在发送给客户端程序,并可通过 客户端错误消息接口获得。
特定错误代码的范围确定服务器是否将错误消息写入错误日志或发送给客户端。有关这些范围的信息,请参阅 错误代码范围。
在 SQL 级别,MySQL 中有多个错误信息来源:
-
SQL 语句警告和错误信息可通过
SHOW WARNINGS
和SHOW ERRORS
语句获得。warning_count
系统变量指示错误、警告和注意(如果sql_notes
系统变量禁用时排除注意)的数量。error_count
系统变量指示错误的数量,排除警告和注意。 -
可以使用
GET DIAGNOSTICS
语句检查诊断区域中的诊断信息。请参阅 第 15.6.7.3 节,“GET DIAGNOSTICS 语句”。 -
SHOW REPLICA STATUS
语句输出包括复制错误信息,发生在副本服务器上。 -
SHOW ENGINE INNODB STATUS
语句输出包括最近的外键错误信息,如果CREATE TABLE
语句为InnoDB
表失败。
客户端程序从两个来源接收错误:
-
来自客户端库内部的错误,来自 MySQL 客户端库。
-
来自服务器端的错误,通过服务器发送给客户端,并在客户端库中可用。
特定错误代码所在的范围决定了它是来自客户端库还是从服务器接收的。有关这些范围的信息,请参阅错误代码范围。
无论错误来自客户端库还是来自服务器,MySQL 客户端程序都可以通过调用客户端库中的 C API 函数来获取错误代码、SQLSTATE 值、消息字符串和其他相关信息:
-
mysql_errno()
返回 MySQL 错误代码。 -
mysql_sqlstate()
返回 SQLSTATE 值。 -
mysql_error()
返回消息字符串。 -
mysql_stmt_errno()
、mysql_stmt_sqlstate()
和mysql_stmt_error()
是预备语句的相应错误函数。 -
mysql_warning_count()
返回最近语句的错误、警告和注意数。
有关客户端库错误函数的描述,请参阅 MySQL 8.3 C API 开发者指南。
MySQL 客户端程序可能以不同的方式响应错误。客户端可能会显示错误消息,以便用户采取纠正措施,或者内部尝试解决或重试失败的操作,或者采取其他操作。例如,(使用 mysql 客户端),服务器连接失败可能会导致以下消息:
$> mysql -h no-such-host
ERROR 2005 (HY000): Unknown MySQL server host 'no-such-host' (-2)
perror 程序提供了命令行关于错误号的信息。请参阅 第 6.8.2 节,“perror — 显示 MySQL 错误消息信息”。
$> perror 1231
MySQL error code MY-001231 (ER_WRONG_VALUE_FOR_VAR): Variable '%-.64s'
can't be set to the value of '%-.200s'
对于 MySQL NDB Cluster 错误,请使用 ndb_perror。请参阅 第 25.5.16 节,“ndb_perror — 获取 NDB 错误消息信息”。
$> ndb_perror 323
NDB error code 323: Invalid nodegroup id, nodegroup already existing:
Permanent error: Application error