本节讨论错误消息如何在 MySQL 中产生以及它们包含的元素。
错误消息可能源自服务器端或客户端:
在服务器端,由于SQL 语句执行过程中出现的问题等,在启动和关闭过程中可能会出现错误消息。
MySQL 服务器将一些错误消息写入其错误日志。这些表明数据库管理员感兴趣或需要 DBA 操作的问题。
服务器向客户端程序发送其他错误消息。这些表示仅与特定客户有关的问题。MySQL 客户端库接受从服务器接收到的错误,并使它们可用于主机客户端程序。
客户端错误消息是从 MySQL 客户端库中生成的,通常涉及与服务器通信的问题。
写入错误日志的服务器端错误消息示例:
在启动过程中产生的这条消息提供了一个状态或进度指示器:
2018-10-28T13:01:32.735983Z 0 [Note] [MY-010303] [Server] Skipping generation of SSL certificates as options related to SSL are specified.
此消息指示需要 DBA 操作的问题:
2018-10-02T03:20:39.410387Z 768 [ERROR] [MY-010045] [Server] Event Scheduler: [evtuser@localhost][myschema.e_daily] Unknown database 'mydb'
发送到客户端程序的服务器端错误消息示例,由mysql客户端显示:
mysql> SELECT * FROM no_such_table;
ERROR 1146 (42S02): Table 'test.no_such_table' doesn't exist
来自客户端库的示例客户端错误消息,由mysql 客户端显示:
$> mysql -h no-such-host
ERROR 2005 (HY000): Unknown MySQL server host 'no-such-host' (-2)
无论错误是来自客户端库还是从服务器接收到,MySQL 客户端程序都可能以不同的方式响应。如刚才所示,客户端可以显示错误消息以便用户可以采取纠正措施。客户端可能会在内部尝试解决或重试失败的操作,或采取其他措施。
发生错误时,错误信息包括几个元素:错误代码、SQLSTATE 值和消息字符串。这些元素具有以下特征:
错误代码:此值为数字。它是特定于 MySQL 的,不能移植到其他数据库系统。
每个错误编号都有相应的符号值。例子:
服务器错误号的符号
1146
是ER_NO_SUCH_TABLE
。客户端错误号的符号
2005
是CR_UNKNOWN_HOST
。
错误消息中使用的错误代码集被划分为不同的范围;请参阅 错误代码范围。
错误代码在给定 MySQL 系列的一般可用性 (GA) 版本中是稳定的。在系列达到 GA 状态之前,新代码可能仍在开发中并且可能会发生变化。
SQLSTATE 值:此值是一个包含五个字符的字符串(例如,
'42S02'
)。SQLSTATE 值取自 ANSI SQL 和 ODBC,比数字错误代码更标准化。SQLSTATE 值的前两个字符表示错误类别:Class =
'00'
表示成功。Class =
'01'
表示警告。Class =
'02'
表示“未找到。”这在游标上下文中是相关的,用于控制游标到达数据集末尾时发生的情况。对于未检索任何行 的语句,也会出现这种情况。SELECT ... INTO
var_list
Class >
'02'
表示异常。
对于服务器端错误,并不是所有的 MySQL 错误号都有相应的 SQLSTATE 值。在这些情况下,
'HY000'
使用(一般错误)。对于客户端错误,SQLSTATE 值始终为
'HY000'
(一般错误),因此对于区分一个客户端错误和另一个客户端错误没有意义。消息字符串:此字符串提供错误的文本描述。
错误消息中使用的错误代码集被划分为不同的范围,每个范围都有自己的用途:
1 到 999:全局错误代码。此错误代码范围称为“全局”,因为它是服务器和客户端使用的共享范围。
当此范围内的错误源自服务器端时,服务器会将其写入错误日志,用前导零填充错误代码至六位数字并添加前缀
MY-
.当此范围内的错误源自客户端时,客户端库会在不使用零填充或前缀的情况下将其提供给客户端程序。
1,000 到 1,999:为发送给客户端的消息保留的服务器错误代码。
2,000 到 2,999:保留供客户端库使用的客户端错误代码。
3,000 到 4,999:为发送给客户端的消息保留的服务器错误代码。
5,000 到 5,999:X 插件为发送给客户端的消息保留的错误代码。
10,000 到 49,999:为要写入错误日志(不发送给客户端)的消息保留的服务器错误代码。
当发生此范围内的错误时,服务器将其写入错误日志,用前导零填充错误代码至六位数字并添加前缀
MY-
.50,000 到 51,999:错误代码保留供第三方使用。
服务器处理写入错误日志的错误消息与发送给客户端的错误消息不同: