# mysql 配置文件格式

## 配置文件语法格式

以下是对配置文件语法的描述：

1.  **在运行 MySQL 程序时，可以在选项文件中使用与在命令行中给出的任何长选项相同的选项**。

    > 要获取程序的可用选项列表，请使用 --help 选项运行它（对于 mysqld，请使用 --verbose 和 --help）。
2. <mark style="color:blue;">**在配置文件中指定选项的语法类似于命令行语法**</mark>。只不过在配置文件中，需要**省略**选项名称前面的**破折号**，并且**每行只指定一个选项**。
3. **配置文件中的空行会被忽略**。非空行可以采用以下任意形式：
   * <mark style="color:blue;">**#**</mark>_<mark style="color:blue;">**comment**</mark>_ 或 <mark style="color:blue;">**;**</mark>_<mark style="color:blue;">**comment**</mark>_
     * 注释行以井号（#）或分号（;）作为开头。
     * 使用 # 号注释也可以在行中间开始。
   * <mark style="color:blue;">**\[group]**</mark>
     * group 是选项的<mark style="color:blue;">**程序或组的名称**</mark>。
     * 在 group 行之后设置的所有选项属于该组，直到到达选项文件的末尾或给出另一个 group 为止。
     * 选项组名称对大小写不敏感。
   * <mark style="color:blue;">**opt\_name**</mark>
     * 这相当于在命令行上使用 **--opt\_name**。
   * <mark style="color:blue;">**opt\_name=value**</mark>&#x20;
     * 这相当于在命令行上使用 **--opt\_name=value**。
     * value 值可以用单引号或双引号括起来，如果值中包含 # 注释字符，则这样做是有用的。

<mark style="color:blue;">**如果选项组名称（group）与程序名称相同，则该组中的选项仅适用于该程序**</mark><mark style="color:blue;">。</mark>

* **\[mysqld]** 和 **\[mysql]** 组分别适用于 **mysqld** 服务器和 **mysql** 客户端程序。&#x20;
* **\[client]** 选项组由 MySQL 的所有客户端程序读取（除了 mysqld）。&#x20;
*   要创建仅由特定版本的 mysqld 服务器读取的选项组，请使用名称为 \[mysqld-5.6]、\[mysqld-5.7]这样的组。\
    下面的组表示 sql\_mode 设置仅应在 MySQL 服务器为 5.7.x 版本号时使用：&#x20;

    ```editorconfig
    [mysqld-5.7] 
    sql_mode=TRADITIONAL
    ```

{% hint style="info" %}
**在配置选项组时，应该先列出较一般的选项组，然后列出更具体的选项组。**

例如，**\[client]** 组更通用，因为它由所有客户端程序读取，而 **\[mysqldump]** 组仅由 mysqldump 读取。<mark style="color:blue;">**后面指定的选项会覆盖先前指定的选项，因此按照 \[client] \[mysqldump] 的顺序排列选项组可以使 mysqldump 特定的选项覆盖 \[client] 选项。**</mark>
{% endhint %}

{% hint style="warning" %}
<mark style="color:blue;">**\[client]**</mark> 组使你能够指定适用于<mark style="color:blue;">**所有客户端**</mark>的选项。因此请确保不要将一个选项放在 **\[client]** 组中，除非所有你使用的客户端程序都识别它。
{% endhint %}

{% hint style="success" %}
<mark style="background-color:green;">**转义字符**</mark>

<mark style="color:blue;">**在配置文件中，反斜杠 ‘\’ 为转义字符。**</mark>

对于 Windows 路径而言，转义字符十分有用，因为 Windows 会使用反斜杠 ‘\’ 作为分隔符。假设想在配置文件中指定 C:\Program Files\MySQL\MySQL Server 5.7 的基目录。有几种方式可以做到：

{% code lineNumbers="true" %}
```editorconfig
basedir="C:\Program Files\MySQL\MySQL Server 5.7"
basedir="C:\\Program Files\\MySQL\\MySQL Server 5.7"
basedir="C:/Program Files/MySQL/MySQL Server 5.7"
basedir=C:\\Program\sFiles\\MySQL\\MySQL\sServer\s5.7
```
{% endcode %}

第一种配置方式之所以有效是因为，配置文件中的转义规则由以下两条组成：

1. **如果转义字符后跟了一个有效转义序列的字符，那么会转换成特定的字符。**\
   例如 \b，\t，\n，\r , \\\\, 和 \s 分别会被转换成退格、制表、换行、回车、反斜杠和空格
2. **如果转义字符后跟了一个无效转义序列的字符，则保持不变。**\
   例如 \S 依然会是 \S，\P 依然是 \P，\M 依然是 \M
{% endhint %}

## Include

可以在一个配置文件中使用 <mark style="color:blue;">**!include**</mark> 指令**包含另一个配置文件**，或者使用 <mark style="color:blue;">**!includedir**</mark> 指令**包含一个文件夹下的所有配置文件**。

例如，如果想在当前配置文件中包含一个名为 /home/mydir/myopt.cnf 的配置文件，可以使用如下的配置：

```inform7
!include /home/mydir/myopt.cnf
```

如果想要包含目录下所有的配置文件，可以使用如下的配置：

```editorconfig
!includedir /home/mydir
```

{% hint style="warning" %}
<mark style="color:orange;">**MySQL 并不保证目录（!includedir）下各配置文件的读取顺序。**</mark>
{% endhint %}

{% hint style="warning" %}
* 在类 **Unix** 的系统上，MySQL 只会将后缀名为 <mark style="color:blue;">**.cnf**</mark> 的文件作为配置文件。
* 在 **Windows** 上，MySQL除了支持 <mark style="color:blue;">**.cnf**</mark> 后缀的配置文件外，还支持 <mark style="color:blue;">**.ini**</mark> 后缀的配置文件。
{% endhint %}
