B.2 错误信息接口
错误信息可以来自服务器端或客户端,每个错误信息都包括一个错误代码、SQLSTATE值和消息字符串,详见第B.1节,“错误信息来源和元素”。关于服务器端、客户端和全局(服务器和客户端共享)错误的列表,见MySQL 8.4 错误信息参考。
在程序中进行错误检查时,使用错误代码号或符号,而不是错误消息字符串。消息字符串不常变化,但可能会发生变化;如果数据库管理员更改语言设置,那么影响消息字符串的语言,详见第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 客户端程序通过在客户端库中调用 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.4 C API 开发者指南。
MySQL 客户端程序可能以不同的方式响应错误。客户端可能显示错误信息,以便用户采取纠正措施,或者内部尝试解决或重试失败的操作,或者采取其他行动。例如,使用 mysql 客户端,如果连接到服务器失败可能显示以下信息:
$> mysql -h no-such-host
ERROR 2005 (HY000): Unknown MySQL server host 'no-such-host' (-2)
命令行程序 perror 提供关于错误号的信息。见第 6.8.1 节,“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 集群错误,使用 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