MySQL 在安装时,会默认创建一个名为 root 的用户,该用户拥有超级权限,可以控制整个 MySQL 服务器。

在对 MySQL 的日常管理和操作中,为了避免有人恶意使用 root 用户控制数据库,我们通常创建一些具有适当权限的用户,尽可能地不用或少用 root 用户登录系统,以此来确保数据的安全访问。

MySQL 提供了以下 3 种方法创建用户。

  • 使用 CREATE USER 语句创建用户
  • 在 mysql.user 表中添加用户
  • 使用 GRANT 语句创建用户

下面根据实例详细讲解这 3 种方法。

1. 使用CREATE USER语句创建用户

可以使用 CREATE USER 语句来创建 MySQL 用户,并设置相应的密码。其基本语法格式如下:

CREATE USER <用户> [ IDENTIFIED BY [ PASSWORD ] 'password' ]
[ ,用户 [ IDENTIFIED BY [ PASSWORD ] 'password' ]]

参数说明如下:
1) 用户
指定创建用户账号,格式为 user_name’@'host_name。这里的user_name是用户名,host_name为主机名,即用户连接 MySQL 时所用主机的名字。如果在创建的过程中,只给出了用户名,而没指定主机名,那么主机名默认为“%”,表示一组主机,即对所有主机开放权限。

2) IDENTIFIED BY子句
用于指定用户密码。新用户可以没有初始密码,若该用户不设密码,可省略此子句。

3) PASSWORD 'password’
PASSWORD 表示使用哈希值设置密码,该参数可选。如果密码是一个普通的字符串,则不需要使用 PASSWORD 关键字。‘password’ 表示用户登录时使用的密码,需要用单引号括起来。

使用 CREATE USER 语句时应注意以下几点:

  • CREATE USER 语句可以不指定初始密码。但是从安全的角度来说,不推荐这种做法。
  • 使用 CREATE USER 语句必须拥有 mysql 数据库的 INSERT 权限或全局 CREATE USER 权限。
  • 使用 CREATE USER 语句创建一个用户后,MySQL 会在 mysql 数据库的 user 表中添加一条新记录。
  • CREATE USER 语句可以同时创建多个用户,多个用户用逗号隔开。

新创建的用户拥有的权限很少,它们只能执行不需要权限的操作。如登录 MySQL、使用 SHOW 语句查询所有存储引擎和字符集的列表等。如果两个用户的用户名相同,但主机名不同,MySQL 会将它们视为两个用户,并允许为这两个用户分配不同的权限集合。

例 1
使用 CREATE USER 创建一个用户,用户名是 test1,密码是 test1,主机名是 localhost。SQL 语句和执行过程如下。

mysql> CREATE USER 'test1'@'localhost' IDENTIFIED BY 'test1';
Query OK, 1 rows affected (0.06 sec)

结果显示,创建 test1 用户成功。

在实际应用中,我们应避免明文指定密码,可以通过 PASSWORD 关键字使用密码的哈希值设置密码。

例 2
在 MySQL 中,可以使用 password() 函数获取密码的哈希值,查看 test1 哈希值的 SQL 语句和执行过程如下:

mysql> SELECT password('test1');
+-------------------------------------------+
| password('test1')                         |
+-------------------------------------------+
| *06C0BF5B64ECE2F648B5F048A71903906BA08E5C |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)

“*06C0BF5B64ECE2F648B5F048A71903906BA08E5C”就是 test1 的哈希值。下面创建用户 test1,SQL 语句和执行过程如下:

mysql> CREATE USER 'test1'@'localhost'IDENTIFIED BY PASSWORD '*06C0BF5B64ECE2F648B5F048A71903906BA08E5C';

执行成功后就可以使用密码“test1”登录了。

2. 使用 INSERT 语句新建用户

可以使用 INSERT 语句将用户的信息添加到 mysql.user 表中,但必须拥有对 mysql.user 表的 INSERT 权限。通常 INSERT 语句只添加 Host、User 和 authentication_string 这 3 个字段的值。

MySQL 5.7 的 user 表中的密码字段从 Password 变成了 authentication_string,如果你使用的是 MySQL 5.7 之前的版本,将 authentication_string 字段替换成 Password 即可。

使用 INSERT 语句创建用户的代码如下:

INSERT INTO
mysql.user(Host, User,  authentication_string, ssl_cipher, x509_issuer, x509_subject)
VALUES ('hostname', 'username', PASSWORD('password'), '', '', '');

由于 mysql 数据库的 user 表中,ssl_cipher、x509_issuer 和 x509_subject 这 3 个字段没有默认值,所以向 user 表插入新记录时,一定要设置这 3 个字段的值,否则 INSERT 语句将不能执行。

例 3
下面使用 INSERT 语句创建名为 test2 的用户,主机名是 localhost,密码也是 test2。SQL 语句和执行过程如下:

mysql> INSERT INTO
mysql.user(Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject)
VALUES ('localhost', 'test2', PASSWORD('test2'), '', '', '');

结果显示,新建用户成功。但是这时如果通过该账户登录 MySQL 服务器,不会登录成功,因为 test2 用户还没有生效。

可以使用 FLUSH 命令让用户生效,命令如下:

FLUSH PRIVILEGES;

使用以上命令可以让 MySQL 刷新系统权限相关表。执行 FLUSH 命令需要 RELOAD 权限。

注意:user 表中的 User 和 Host 字段区分大小写,创建用户时要指定正确的用户名称或主机名。

3. 使用GRANT语句新建用户

虽然 CREATE USER 和 INSERT INTO 语句都可以创建普通用户,但是这两种方式不便授予用户权限。于是 MySQL 提供了 GRANT 语句。

使用 GRANT 语句创建用户的基本语法形式如下:

GRANT priv_type ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password']

其中:

  • priv_type 参数表示新用户的权限;
  • database.table 参数表示新用户的权限范围,即只能在指定的数据库和表上使用自己的权限;
  • user 参数指定新用户的账号,由用户名和主机名构成;
  • IDENTIFIED BY 关键字用来设置密码;
  • password 参数表示新用户的密码。

例 4
下面使用 GRANT 语句创建名为 test3 的用户,主机名为 localhost,密码为 test3。该用户对所有数据库的所有表都有 SELECT 权限。SQL 语句和执行过程如下:

mysql> GRANT SELECT ON*.* TO 'test3'@localhost IDENTIFIED BY 'test3';
Query OK, 0 rows affected, 1 warning (0.01 sec)

其中,“*.*” 表示所有数据库下的所有表。结果显示创建用户成功,且 test3 用户对所有表都有查询(SELECT)权限。

技巧:GRANT 语句是 MySQL 中一个非常重要的语句,它可以用来创建用户、修改用户密码和设置用户权限。后面会详细介绍如何使用GRANT 语句修改密码、更改权限。

3、创建用户(3种方式)相关推荐

  1. (精华)转:RDD:创建的几种方式(scala和java)

    转: https://blog.csdn.net/weixin_38750084/article/details/82769600 这篇文章非常棒, 用代码实际演示了如何创建RDD: 本文主要转载了 ...

  2. Java中线程的创建有两种方式

    Java中继承thread类与实现Runnable接口的区别 Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过 ...

  3. java多线程学习一、线程介绍、线程创建的3种方式、lambda创建方式、线程状态、线程示例:12306买票和银行取钱

    文章目录 前言 一.线程简介 1.概述 2.进程.线程 区别 在这里插入图片描述 3. 核心概念 二. 线程创建 1.概述 2. 第一种方式继承Thread 1) 继承Thread 2) 示例:下载图 ...

  4. JavaScript---网络编程(9-1)--DHTML技术演示(2-1)-表格创建的几种方式

    一:用最底层的方式,该方式用来创建别的对象树也可以 代码演示: <html><head><title>DHTML技术演示---表格创建--用最底层的方式,其实该方式 ...

  5. 一心多用多线程-线程创建的三种方式

    第一次了解java线程机制,记录一下线程启动的三种方式. 1.通过继承Thread类调用一个线程 public class Thread1 extends Thread{@Overridepublic ...

  6. Qt创建线程两种方式的区别

    使用QT创建线程有两种方式,方式A使用moveToThread,方式B是直接继承QThread.差异主要在于方式A的槽函数将会在新线程中运行,而方式B的槽函数在旧线程中运行. 结论如下: PS:旧线程 ...

  7. 线程生命周期以及线程创建的三种方式

    1. 线程生命周期 线程生命周期图 新建状态(New) 当线程对象创建后,即进入新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable) 当调用线程对象的sta ...

  8. 浅析Revit体量创建的几种方式

    随着项目经验的不断加深,可以发现在通过Revit进行开发过程中,创建体量是一个非常重要的工作,今天就在族文件中通过拉伸创建体量的几种方式进行说明以及简单示例,供大家参考. 体量创建API 通过轮廓和拉 ...

  9. javascript对象创建的五种方式

    <html> <head> <script> /* 5.动态原型法 */ function DCar(name,price){this.name=name;this ...

  10. GitHub创建分支两种方式

    文章目录 一:需求背景 二:创建方式 2.1 方式一:`使用IDEA开发工具现在本地创建一个新的分支,然后在push至远程仓库即可.` 2.2 使用Git命令来创建. 2.3 删除本地分支 一:需求背 ...

最新文章

  1. mysql 帮助命令_一篇文章帮你搞定所有MySQL命令!
  2. linux 下 upx 脱壳笔记
  3. 九十五、轻松搞定Python中的Excel办公自动化系列
  4. 炸了!亚马逊薪资文件泄露!原来这么多人年薪百万
  5. java Excel导入、自适应版本、将Excel转成Listmap对象
  6. MySQL主从复制原理(原理+实操)
  7. curl header设置参数
  8. Ip-san 配置过程
  9. 如何阅读源码,阅读源码的难点和方法分析
  10. 【机器学习】基于朴树贝叶斯的言论过滤器
  11. 怎么将拍的照片免费转成PDF文件呢
  12. Linux挂载msdos分区,磁盘构造/msdos分区(fdisk)格式化(mkfs)和挂载
  13. 带时间轴的文章归档的html页面,Css打造伸缩时间轴样式的WordPress归档页面archive.php...
  14. 火车采集器如何采集ajax数据和百度站内搜索数据
  15. Invalid bound statement (not found): com.xxx.mapper.xxxMapper.selectxxx
  16. 网络中的中间商(CDN)
  17. T007V-采购订单税码对应的税率所在后台表
  18. 年薪达 35 万元,杭州成为薪酬最高的城市,北上、重庆通勤时间最久,揭晓 2022 年最具潜力的软件名城!
  19. 如何防止手机网页双击屏幕实现放大效果
  20. 城市太美、生活步调太悠闲

热门文章

  1. BTC:简单易懂比特币之比特币的神奇——区块链技术的体现
  2. DL之Encoder-Decoder:Encoder-Decoder结构的相关论文、设计思路、关键步骤等配图集合之详细攻略
  3. Google提出的新型激活函数:Swish
  4. react中component存在性能问题
  5. Katalon Studio之swagger中的API导入
  6. ES6(三)数组的扩展
  7. Headmaster's Headache
  8. DZ各个数据表详解(DZ论坛各表详细说明,二次开发用)
  9. 非常好的dllimport 文章--在 C# 中通过 P/Invoke 调用Win32 DLL
  10. sql getdate() 时间格式设置