## B.1 错误消息来源和元素

本节讨论错误消息如何在 MySQL 中产生以及它们包含的元素。

-   [错误消息来源](error-message-elements.html#error-sources)

-   [错误消息元素](error-message-elements.html#error-elements)

-   [错误代码范围](error-message-elements.html#error-code-ranges)

### 错误消息来源

错误消息可能源自服务器端或客户端：

-   在服务器端，在启动和关闭过程中可能会出现错误消息，这是由于 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.html)客户：


```
mysql> SELECT * FROM no_such_table;
ERROR 1146 (42S02): Table 'test.no_such_table' doesn't exist
```

源自客户端库中的示例客户端错误消息，由[**mysql**](mysql.html)客户：

```
$> mysql -h no-such-host
ERROR 2005 (HY000): Unknown MySQL server host 'no-such-host' (-2)
```

无论错误来自客户端库内部还是来自服务器，MySQL 客户端程序都可能以不同的方式响应。如刚刚所示，客户端可能会显示错误消息，以便用户可以采取纠正措施。客户端可能会在内部尝试解决或重试失败的操作，或采取其他措施。

### 错误消息元素

发生错误时，错误信息包括几个元素：错误代码、SQLSTATE 值和消息字符串。这些元素具有以下特点：

-   错误代码：此值为数字。它是 MySQL 特有的，不能移植到其他数据库系统。

    每个错误号都有一个对应的符号值。例子：

    -   服务器错误号的符号`1146`是[`ER_NO_SUCH_TABLE`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_no_such_table).

    -   客户端错误号的符号`2005年`是[`CR_UNKNOWN_HOST`](https://dev.mysql.com/doc/mysql-errors/8.0/en/client-error-reference.html#error_cr_unknown_host).

        错误消息中使用的错误代码集被划分为不同的范围；看[错误代码范围](error-message-elements.html#error-code-ranges).

        错误代码在给定 MySQL 系列的通用 (GA) 版本中是稳定的。在系列达到 GA 状态之前，新代码可能仍在开发中并且可能会发生变化。

-   SQLSTATE 值：该值是五个字符的字符串（例如，`'42S02'`）。SQLSTATE 值取自 ANSI SQL 和 ODBC，比数字错误代码更标准化。SQLSTATE 值的前两个字符表示错误类别：

    -   类 =`'00'`表示成功。

    -   类 =`'01'`表示警告。

    -   阶级=`'02'`表示“未找到”这与游标的上下文相关，用于控制游标到达数据集末尾时发生的情况。这种情况也会发生在`选择进入*`var\_列表`*`不检索行的语句。

    -   班> `'02'`表示异常。

        对于服务器端错误，并非所有MySQL错误号都有相应的SQLSTATE值。在这些情况下，`“HY000”`（一般错误）被使用。

        对于客户端错误，SQLSTATE值始终为`“HY000”`（一般错误），因此区分一个客户端错误和另一个客户端错误没有意义。

-   消息字符串：该字符串提供错误的文本描述。

### 错误代码范围

错误消息中使用的错误代码集被划分为不同的范围，每个范围都有自己的用途：

-   1至999：全局错误代码。此错误代码范围称为“全局”，因为它是服务器和客户端使用的共享范围。

    当服务器端出现此范围内的错误时，服务器会将其写入错误日志，用前导零填充错误代码至六位，并添加前缀`我的-`.

    当此范围内的错误源于客户端时，客户端库将使客户端程序可以使用该错误，而不使用零填充或前缀。

-   1000到1999：为发送到客户端的消息保留服务器错误代码。

-   2000至2999：保留供客户端库使用的客户端错误代码。

-   3000到4999：为发送到客户端的消息保留服务器错误代码。

-   5000到5999：X插件为发送给客户端的消息保留错误代码。

-   10000到49999：为写入错误日志（不发送到客户端）的消息保留的服务器错误代码。

    当发生此范围内的错误时，服务器会将其写入错误日志，用前导零填充错误代码至六位，并添加前缀`我的-`.

-   50000到51999：保留错误代码供第三方使用。

    服务器处理写入错误日志的错误消息的方式与处理发送给客户端的错误消息的方式不同：

-   当服务器将消息写入错误日志时，它会将前导零填充到六位数字，并添加前缀`我的-`（例如：[`MY-000022`](https://dev.mysql.com/doc/mysql-errors/8.0/en/global-error-reference.html#error_ee_unknown_charset), [`MY-010048`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_scheduler_stopped)).

-   当服务器向客户端程序发送消息时，它不会在错误代码中添加零填充或前缀（例如：[`1036`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_open_as_readonly), [`3013`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_invalid_field_size)).
