MySQL创建新用户的2种方式(附带实例)
MySQL 提供了许多语句来管理用户账号,包括登录和退出 MySQL 服务器、创建用户、删除用户、密码管理和权限管理等内容。MySQL 数据库的安全性需要通过账户管理来保证。
在MySQL数据库中,创建新用户必须有相应的权限来执行创建操作,有两种方式创建新用户:
下面分别介绍这两种创建新用户的方法。
CREATE USER 语句的基本语法格式如下:
CREATE USER 语句会添加一个新的 MySQL 账户。使用 CREATE USER 语句的用户,必须有全局的 CREATE USER 权限或 mysql 数据库的 INSERT 权限。每添加一个用户,CREATE USER 语句会在 mysql.user 表中添加一条新记录,但是新创建的账户没有任何权限。如果添加的账户已经存在,CREATE USER 语句会返回一个错误。
【实例】使用 CREATE USER 创建一个用户,用户名是 jeffrey,密码是 mypass,主机名是 localhost,命令如下:
user_specification 告诉 MySQL 服务器当用户登录时怎么验证用户的登录授权。如果指定用户登录不需要密码,可以省略 IDENTIFIED BY 部分:
如果要创建指定密码的用户,需要 IDENTIFIED BY 指定明文密码值:
MySQL 的某些版本中会引入授权表的结构变化,添加新的特权或功能。每当更新 MySQL 到一个新的版本时,应该检查授权表,以确保它们有最新的结构,确认可以使用任何新功能。
使用 INSERT 语句,必须拥有对 mysql.user 表的 INSERT 权限。使用 INSERT 语句创建新用户的基本语法格式如下:
【实例】使用 INSERT 创建一个新账户,其用户名称为 customer1,主机名称为 localhost,密码为 aa123456,INSERT 语句如下:
语句执行失败,查看警告信息如下:
使用 SELECT 语句查看 user 表中的记录:
在MySQL数据库中,创建新用户必须有相应的权限来执行创建操作,有两种方式创建新用户:
- 一种是使用 CREATE USER 语句;
- 另一种是直接操作 MySQL 授权表。
下面分别介绍这两种创建新用户的方法。
使用CREATE USER语句创建新用户
执行 CREATE USER 或GRANT 语句时,服务器会修改相应的用户授权表,添加或者修改用户及其权限。CREATE USER 语句的基本语法格式如下:
CREATE USER user_specification [, user_specification] ... user_specification: user@host [ IDENTIFIED BY [PASSWORD] 'password' | IDENTIFIED WITH auth_plugin [AS 'auth_string'] ]
- user 表示创建的用户的名称;
- host 表示允许登录的用户主机名称;
- IDENTIFIED BY 表示用来设置用户的密码;
- [PASSWORD] 表示使用哈希值设置密码,该参数可选;
- 'password' 表示用户登录时使用的普通明文密码;
- IDENTIFIED WITH 语句为用户指定一个身份验证插件;
- auth_plugin 是插件的名称,插件的名称可以是一个带单引号的字符串或者带双引号的字符串;
- auth_string 是可选的字符串参数,该参数将传递给身份验证插件,由该插件解释该参数的意义。
CREATE USER 语句会添加一个新的 MySQL 账户。使用 CREATE USER 语句的用户,必须有全局的 CREATE USER 权限或 mysql 数据库的 INSERT 权限。每添加一个用户,CREATE USER 语句会在 mysql.user 表中添加一条新记录,但是新创建的账户没有任何权限。如果添加的账户已经存在,CREATE USER 语句会返回一个错误。
【实例】使用 CREATE USER 创建一个用户,用户名是 jeffrey,密码是 mypass,主机名是 localhost,命令如下:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';如果只指定用户名部分 'jeffrey',主机名部分则默认为 '%'(对所有的主机开放权限)。
user_specification 告诉 MySQL 服务器当用户登录时怎么验证用户的登录授权。如果指定用户登录不需要密码,可以省略 IDENTIFIED BY 部分:
CREATE USER 'jeffrey'@'localhost';此种情况,MySQL 服务端使用内建的身份验证机制,用户登录时不能指定密码。
如果要创建指定密码的用户,需要 IDENTIFIED BY 指定明文密码值:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';此种情况,MySQL 服务端使用内建的身份验证机制,用户登录时必须指定密码。
MySQL 的某些版本中会引入授权表的结构变化,添加新的特权或功能。每当更新 MySQL 到一个新的版本时,应该检查授权表,以确保它们有最新的结构,确认可以使用任何新功能。
直接操作MySQL用户表
通过前面的介绍,使用 CREATE USER 创建新用户时,实际上都是在 user 表中添加一条新的记录。因此,可以使用 INSERT 语句向 user 表中直接插入一条记录来创建一个新的用户。使用 INSERT 语句,必须拥有对 mysql.user 表的 INSERT 权限。使用 INSERT 语句创建新用户的基本语法格式如下:
INSERT INTO MySQL.user(Host, User, authentication_string) VALUES('host', 'username', MD5('password'));Host、User、authentication_string 分别为 user 表中的主机、用户名称和密码字段;MD5() 函数为密码加密函数。
【实例】使用 INSERT 创建一个新账户,其用户名称为 customer1,主机名称为 localhost,密码为 aa123456,INSERT 语句如下:
INSERT INTO user (Host,User, authentication_string) VALUES('localhost','customer1', MD5('aa123456'));语句执行结果如下:
MySQL> use mysql; MySQL> INSERT INTO user (Host,User, authentication_string) -> VALUES('localhost','customer1', MD5('aa123456')); ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value
语句执行失败,查看警告信息如下:
MySQL> SHOW WARNINGS; +-------+------+---------------------------------------------------+ | Level | Code | Message | +-------+------+---------------------------------------------------+ | Error | 1364 | Field 'ssl_cipher' doesn't have a default value | | Error | 1364 | Field 'x509_issuer' doesn't have a default value | | Error | 1364 | Field 'x509_subject' doesn't have a default value | +-------+------+---------------------------------------------------+因为 ssl_cipher、x509_issuer 和 x509_subject 3 个字段在 user 表定义中没有设置默认值,所以在这里提示错误信息,影响 INSERT 语句的执行。
使用 SELECT 语句查看 user 表中的记录:
MySQL> SELECT host,user, authentication_string FROM user ; +---------+----------------+---------------------------------------------+ | host | user |authentication_string | +---------+----------------+---------------------------------------------+ |localhost|jeffrey |*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 | |localhost|mysql.infoschema|$A$005$THISISACOMBINATIONOFIVALIDSALTANDP | |localhost|mysql.session |$A$005$THISISACOMBINATIONOFINVALIDSALTANDPAS | |localhost|mysql.sys |$A$005$THISISACOMBINATIONOFINVAUSTNEVERREUSED| |localhost|root |*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 | +---------+----------------+---------------------------------------------+可以看到新用户 customer1 并没有添加到 user 表中,说明添加新用户失败。