Documentation Home

13.7.1.2 创建用户语句

CREATE USER
    user [auth_option] [, user [auth_option]] ...

user:
    (see Section 6.2.4, “Specifying Account Names”)

auth_option: {
    IDENTIFIED BY [PASSWORD] 'auth_string'
  | IDENTIFIED WITH auth_plugin [AS 'auth_string']
}

CREATE USER语句创建新的 MySQL 帐户。如果您尝试创建一个已经存在的帐户,则会发生错误。

要使用CREATE USER,您必须具有全局CREATE USER权限或系统数据库INSERT权限 。mysqlread_only启用系统变量时,CREATE USER额外需要SUPER权限。

重要的

在某些情况下,CREATE USER可能会记录在服务器日志中或在客户端的历史文件中,例如 ~/.mysql_history,这意味着任何对该信息具有读取权限的人都可以读取明文密码。有关服务器日志发生这种情况的条件以及如何控制它的信息,请参阅第 6.1.2.3 节,“密码和日志记录”。有关客户端日志记录的类似信息,请参阅 第 4.5.1.3 节,“mysql 客户端日志记录”

对于每个帐户,CREATE USER 在系统表中创建一个没有权限的新行,mysql.user并为该帐户分配一个身份验证插件。根据使用的语法, CREATE USER还可以为帐户分配一个密码。

首次创建的帐户没有特权。要分配权限,请使用该GRANT 语句。

每个user命名帐户的值后面都可以跟一个可选 auth_option值,该值指定如何为使用该帐户的客户端进行身份验证。这部分CREATE USER语法与 共享GRANT,因此此处的描述也适用于GRANT

每个帐户名都使用 第 6.2.4 节“指定帐户名”中描述的格式。例如:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';

帐户名的主机名部分(如果省略)默认为 '%'.

服务器为每个帐户分配一个身份验证插件和密码,具体取决于用户规范子句是否包含IDENTIFIED BYIDENTIFIED WITH指定身份验证信息:

  • 使用IDENTIFIED BY,服务器隐式分配插件。该 值是明文,并传递给插件以进行可能的哈希处理。插件返回的结果存储为密码。插件可以使用指定的值,在这种情况下不会发生散列。如果给出了可选 关键字,则行为是相同的,除了如果插件需要散列字符串,则假定该字符串已经按照插件要求的格式散列,并按原样存储为密码。 'auth_string'PASSWORD

  • 使用IDENTIFIED WITH,服务器分配指定的插件并且该帐户没有密码。如果给出了可选子句,则字符串将按原样存储为密码。如果插件需要哈希字符串,则假定该字符串已经按照插件所需的格式进行了哈希处理。 AS 'auth_string'

  • 对于 neither IDENTIFIED BYnor IDENTIFIED WITH,服务器隐式分配插件并且帐户没有密码。

如果账户没有密码,则mysql.user表中账户行的密码信息为空,不安全。要设置密码,请使用 SET PASSWORD。请参阅 第 13.7.1.7 节,“SET PASSWORD 语句”

对于隐式插件分配,默认插件成为plugin帐户 mysql.user系统表行中列的值。 除非在服务器启动时以其他方式设置 mysql_native_password该 选项,否则默认插件是。--default-authentication-plugin

对于使用给定帐户的客户端连接,服务器调用分配给该帐户的身份验证插件,并且客户端必须根据插件实现的身份验证方法的要求提供凭据。如果服务器在帐户创建时或连接时找不到插件,则会发生错误。

如果帐户的mysql.user表行有一个非空plugin列:

如果帐户的mysql.user表格行有一个空plugin列:

  • mysql_native_password服务器使用或 身份验证插件对 客户端连接尝试进行mysql_old_password身份验证,具体取决于 Password列中存储的密码的哈希格式。

  • SET PASSWORD可以 使用 更改帐户密码 PASSWORD()old_passwords分别为 4.1 或 4.1 之前的密码哈希设置为 0 或 1,或者使用 OLD_PASSWORD(),无论 的值如何,它都使用 4.1 之前的密码哈希 old_passwords

CREATE USER例子:

  • 要为帐户指定身份验证插件,请使用 . 插件名称可以是带引号的字符串文字或不带引号的名称。 是传递给插件的可选带引号的字符串文字。插件解释字符串的含义,因此它的格式是特定于插件的,并且它存储在 给定的列中。(此值仅对使用该列的插件有意义。)有关给定插件接受的身份验证字符串值(如果有)的信息,请参阅给定插件的文档。 IDENTIFIED WITH auth_plugin'auth_string'authentication_string

    CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password;

    服务器将给定的身份验证插件分配给帐户,但没有密码。客户端在连接时不得提供密码。但是,没有密码的帐户是不安全的。要确保帐户使用特定的身份验证插件并具有具有相应哈希格式的密码,请使用 明确指定插件IDENTIFIED WITH,然后使用 SET PASSWORD设置密码:

    CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_native_password;
    SET old_passwords = 0;
    SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('password');

    SET PASSWORD使用with 更改帐户密码 PASSWORD()必须将old_passwords系统变量设置为帐户身份验证插件所需的值,以便 PASSWORD()使用适当的密码哈希方法。因此,要改用 sha256_passwordmysql_old_password插件,请在CREATE USER语句中命名该插件,并 old_passwords在使用 之前分别将其设置为 2 或 1 SET PASSWORD。( mysql_old_password不推荐使用。它已被弃用;希望在未来的 MySQL 版本中删除对它的支持。)

  • 要在帐户创建时为帐户指定密码,请使用IDENTIFIED BY文字明文密码值:

    CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';

    如前所述,服务器隐式地将身份验证插件分配给帐户,并分配给定的密码。客户端在连接时必须提供给定的密码。

    如果隐式分配的插件是 mysql_native_password,则 old_passwords系统变量必须设置为 0。否则, CREATE USER不会以插件要求的格式散列密码,并发生错误:

    mysql> SET old_passwords = 1;
    mysql> CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
    ERROR 1827 (HY000): The password hash doesn't have the expected
    format. Check if the correct password algorithm is being used with
    the PASSWORD() function.
    
    mysql> SET old_passwords = 0;
    mysql> CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
    Query OK, 0 rows affected (0.00 sec)
  • 如果您知道其散列值( PASSWORD()将为密码返回的值),要避免指定明文密码,请在关键字之前指定散列值PASSWORD

    CREATE USER 'jeffrey'@'localhost'
    IDENTIFIED BY PASSWORD '*90E462C37378CED12064BB3388827D2BA3A9B689';

    如前所述,服务器隐式地将身份验证插件分配给帐户,并分配给定的密码。密码哈希必须采用指定插件所需的格式。客户端在连接时必须提供密码。

  • 要使用户无需密码即可连接,请不包含 IDENTIFIED BY子句:

    CREATE USER 'jeffrey'@'localhost';

    如前所述,服务器隐式地为帐户分配一个身份验证插件,但没有密码。客户端在连接时不得提供密码。但是,没有密码的帐户是不安全的。为避免这种情况,请使用 SET PASSWORD设置帐户密码。

如前所述,隐式插件分配取决于默认身份验证插件。的允许值 --default-authentication-pluginmysql_native_pluginsha256_password,但不是 mysql_old_password。这意味着无法设置默认插件以便能够创建使用mysql_old_passwordwith CREATE USER ... IDENTIFIED BY语法的帐户。要创建一个使用 的帐户,请使用 mysql_old_password明确CREATE USER ... IDENTIFIED WITH命名插件,然后设置密码:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH mysql_old_password;
SET old_passwords = 1;
SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('password');

但是,不推荐使用上述过程,因为 mysql_old_password它已被弃用。

有关设置密码和身份验证插件的其他信息,请参阅 第 6.2.9 节,“分配帐户密码”第 6.2.11 节,“可插入身份验证”