### 6.2.1 账户用户名和密码

[](<>)[](<>)

MySQL 将帐户存储在`用户`的表`mysql`系统数据库。帐户是根据用户名和用户可以连接到服务器的客户端主机或主机来定义的。有关在`用户`表，见[第 6.2.3 节，“授权表”](grant-tables.html).

帐户还可能具有身份验证凭据，例如密码。凭据由帐户身份验证插件处理。MySQL 支持多个身份验证插件。其中一些使用内置的身份验证方法，而另一些则使用外部身份验证方法启用身份验证。看[第 6.2.17 节，“可插拔身份验证”](pluggable-authentication.html).

MySQL 和您的操作系统使用用户名和密码的方式有几个区别：

-   MySQL 用于身份验证的用户名与 Windows 或 Unix 使用的用户名（登录名）无关。在 Unix 上，大多数 MySQL 客户端默认尝试使用当前的 Unix 用户名作为 MySQL 用户名登录，但这只是为了方便。可以轻松覆盖默认值，因为客户端程序允许使用`-u`要么`- 用户`选项。这意味着任何人都可以尝试使用任何用户名连接到服务器，因此除非所有 MySQL 帐户都有密码，否则您无法以任何方式确保数据库安全。为没有密码的帐户指定用户名的任何人都可以成功连接到服务器。

-   MySQL 用户名最长为 32 个字符。操作系统用户名的最大长度可能不同。

    警告

    MySQL 用户名长度限制在 MySQL 服务器和客户端中是硬编码的，并试图通过修改表中的定义来规避它。`mysql`数据库*不工作*.

    你不应该改变表的结构`mysql`以任何方式建立数据库，除非通过[第 2.11 节，“升级 MySQL”](upgrading.html).尝试以任何其他方式重新定义 MySQL 的系统表会导致未定义和不受支持的行为。服务器可以自由地忽略由于此类修改而导致格式错误的行。

-   为了验证使用内置验证方法的帐户的客户端连接，服务器使用存储在`用户`桌子。这些密码与登录操作系统的密码不同。您用于登录 Windows 或 Unix 机器的“外部”密码与您用于访问该机器上的 MySQL 服务器的密码之间没有必要的联系。

    如果服务器使用其他插件对客户端进行身份验证，则插件实现的身份验证方法可能使用也可能不使用存储在`用户`桌子。在这种情况下，也可能使用外部密码对 MySQL 服务器进行身份验证。

-   密码存储在`用户`表使用插件特定的算法进行加密。

-   如果用户名和密码仅包含 ASCII 字符，则无论字符集设置如何，都可以连接到服务器。要在用户名或密码包含非 ASCII 字符时启用连接，客户端应用程序应调用[`mysql_options()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-options.html)C API 函数与`MYSQL_SET_CHARSET_NAME`选项和适当的字符集名称作为参数。这会导致使用指定的字符集进行身份验证。否则，除非服务器默认字符集与身份验证默认值中的编码相同，否则身份验证将失败。

    标准 MySQL 客户端程序支持`--默认字符集`导致的选项[`mysql_options()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-options.html)像刚才描述的那样被调用。此外，支持字符集自动检测，如中所述[第 10.4 节，“连接字符集和排序规则”](charset-connection.html).对于使用不基于 C API 的连接器的程序，连接器可以提供等效于[`mysql_options()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-options.html)可以代替使用。检查连接器文档。

    上述说明不适用于`ucs2`,`utf16`， 和`utf32`, 不允许作为客户端字符集。

    MySQL 安装过程使用初始值填充授权表`根`帐户，如中所述[第 2.10.4 节，“保护初始 MySQL 帐户”](default-privileges.html)，其中还讨论了如何为其分配密码。此后，您通常使用以下语句设置、修改和删除 MySQL 帐户[`创建用户`](create-user.html),[`删除用户`](drop-user.html),[`授予`](grant.html)， 和[`撤销`](revoke.html).看[第 6.2.8 节，“添加帐户、分配权限和删除帐户”](creating-accounts.html)， 和[第 13.7.1 节，“账户管理声明”](account-management-statements.html).

    要使用命令行客户端连接到 MySQL 服务器，请根据需要为要使用的帐户指定用户名和密码选项：


```
$> mysql --user=finley --password db_name
```

如果您更喜欢短选项，该命令如下所示：

```
$> mysql -u finley -p db_name
```

如果您在后面省略密码值[`- 密码`](connection-options.html#option_general_password)要么`-p`命令行上的选项（如图所示），客户端提示输入一个。或者，可以在命令行上指定密码：

```
$> mysql --user=finley --password=password db_name
$> mysql -u finley -ppassword db_name
```

如果您使用`-p`选项，必须有*没有空间*之间`-p`和以下密码值。

在命令行上指定密码应该被认为是不安全的。看[第 6.1.2.1 节，“最终用户密码安全指南”](password-security-user.html).为避免在命令行上提供密码，请使用选项文件或登录路径文件。看[第 4.2.2.2 节，“使用选项文件”](option-files.html)， 和[第 4.6.7 节，“mysql\_配置\_编辑器 — MySQL 配置实用程序”](mysql-config-editor.html).

有关指定用户名、密码和其他连接参数的更多信息，请参阅[第 4.2.4 节，“使用命令选项连接到 MySQL 服务器”](connecting.html).
