Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Option Defaults, Options Expecting Values, and the = Sign

6.2.2.6 选项默认值、期望值选项和等号

按照惯例,长形式的选项分配值时写入等号(=),如下所示:

mysql --host=tonfisk --user=jon

对于需要值的选项(即没有默认值),等号不是必需的,因此以下也是有效的:

mysql --host tonfisk --user jon

在这两种情况下,mysql 客户端尝试连接到主机名为 tonfisk 的 MySQL 服务器,使用用户名 jon 的账户。

由于这种行为,偶尔会出现问题,当没有为期望值的选项提供值时。考虑以下示例,其中用户连接到主机 tonfisk 的 MySQL 服务器,用户名为 jon

$> mysql --host 85.224.35.45 --user jon
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 8.3.0 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SELECT CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| jon@%          |
+----------------+
1 row in set (0.00 sec)

省略期望值的选项将导致错误,如下所示:

$> mysql --host 85.224.35.45 --user
mysql: option '--user' requires an argument

在这种情况下,mysql 无法在命令行中找到 --user 选项后的值。然而,如果您省略了不是最后一个选项的值,您将获得一个不同的错误:

$> mysql --host --user jon
ERROR 2005 (HY000): Unknown MySQL server host '--user' (1)

因为 mysql 假设命令行上 --host 之后的任何字符串都是主机名,--host --user 被解释为 --host=--user,客户端尝试连接到名为 --user 的 MySQL 服务器。

具有默认值的选项总是需要等号来分配值;否则将导致错误。例如,MySQL 服务器 --log-error 选项的默认值为 host_name.err,其中 host_name 是 MySQL 运行的主机名。假设您在名为 tonfisk 的计算机上运行 MySQL,并考虑以下 mysqld_safe 调用:

$> mysqld_safe &
[1] 11699
$> 080112 12:53:40 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'.
080112 12:53:40 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
$>

关闭服务器后,重新启动如下:

$> mysqld_safe --log-error &
[1] 11699
$> 080112 12:53:40 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'.
080112 12:53:40 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
$>

结果相同,因为 --log-error 没有在命令行上跟随任何内容,并提供了自己的默认值。(& 字符告诉操作系统在后台运行 MySQL;它被 MySQL 本身忽略。)现在假设您想将错误日志记录到名为 my-errors.err 的文件中。您可能尝试使用 --log-error my-errors 启动服务器,但这并没有达到预期的效果,如下所示:

$> mysqld_safe --log-error my-errors &
[1] 31357
$> 080111 22:53:31 mysqld_safe Logging to '/usr/local/mysql/var/tonfisk.err'.
080111 22:53:32 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
080111 22:53:34 mysqld_safe mysqld from pid file /usr/local/mysql/var/tonfisk.pid ended

[1]+  Done                    ./mysqld_safe --log-error my-errors

服务器尝试使用 /usr/local/mysql/var/tonfisk.err 作为错误日志,但然后关闭。检查该文件的最后几行显示了原因:

$> tail /usr/local/mysql/var/tonfisk.err
2013-09-24T15:36:22.278034Z 0 [ERROR] Too many arguments (first extra is 'my-errors').
2013-09-24T15:36:22.278059Z 0 [Note] Use --verbose --help to get a list of available options!
2013-09-24T15:36:22.278076Z 0 [ERROR] Aborting
2013-09-24T15:36:22.279704Z 0 [Note] InnoDB: Starting shutdown...
2013-09-24T15:36:23.777471Z 0 [Note] InnoDB: Shutdown completed; log sequence number 2319086
2013-09-24T15:36:23.780134Z 0 [Note] mysqld: Shutdown complete

因为 --log-error 选项提供了默认值,您必须使用等号来分配不同的值,如下所示:

$> mysqld_safe --log-error=my-errors &
[1] 31437
$> 080111 22:54:15 mysqld_safe Logging to '/usr/local/mysql/var/my-errors.err'.
080111 22:54:15 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var

$>

现在服务器已经成功启动,并将错误日志记录到 /usr/local/mysql/var/my-errors.err 文件中。

类似的问题也可能出现在选项文件中。例如,考虑一个 my.cnf 文件,其中包含以下内容:

[mysql]

host
user

mysql 客户端读取该文件时,这些条目被解析为 --host --user--host=--user,结果如下所示:

$> mysql
ERROR 2005 (HY000): Unknown MySQL server host '--user' (1)

然而,在选项文件中,不假设等号。假设 my.cnf 文件如下所示:

[mysql]

user jon

尝试在这种情况下启动 mysql 导致不同的错误:

$> mysql
mysql: unknown option '--user jon'

如果在选项文件中写入 host tonfisk 而不是 host=tonfisk,则会出现类似的错误。相反,您必须使用等号:

[mysql]

user=jon

现在登录尝试成功:

$> mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 8.3.0 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SELECT USER();
+---------------+
| USER()        |
+---------------+
| jon@localhost |
+---------------+
1 row in set (0.00 sec)

这与命令行中的行为不同,在命令行中不需要等号:

$> mysql --user jon --host tonfisk
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 8.3.0 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SELECT USER();
+---------------+
| USER()        |
+---------------+
| jon@tonfisk   |
+---------------+
1 row in set (0.00 sec)

在选项文件中指定需要值的选项但不提供值将导致服务器以错误终止。