为了数据库安全,应避免频繁使用 root 用户,而是为不同应用和人员创建具有适当权限的专属用户。

方法对比速览

 特性  `CREATE USER` (推荐)  `GRANT` (推荐)  `INSERT INTO` (不推荐)

易用性  高,语法简单直观  高,创建和授权一步到位 低,需手动处理字段和权限刷新

 安全性  高  高  中,容易因遗漏字段或忘记刷新导致错误

 功能  只创建用户,不授权  创建用户并同时授权  只创建用户,不授权

 

方法详解与示例

1. 使用 `CREATE USER` 语句 (最标准的方法)

基本语法:

CREATE USER 'username'@'host' IDENTIFIED BY 'password';

参数说明:

   `'username'@'host'`:用户标识。

       `host` 指定允许连接的主机,是实现安全的关键。

       `'localhost'`:只能从数据库服务器本机连接。

       `'192.168.1.%'`:允许从 `192.168.1.0/24` 网段连接。

       `'%'`:允许从任何主机连接(生产环境慎用)。

   `IDENTIFIED BY 'password'`:设置明文密码。MySQL 会自动将其加密后存入 `authentication_string` 字段。

 

示例 1:创建本地用户

 创建用户 test1,只能从本机登录,密码为 test1

CREATE USER 'test1'@'localhost' IDENTIFIED BY 'test1';

特点:

   新创建的用户权限极少,只有 `USAGE` 权限,意味着能登录但几乎不能做任何操作。

   创建后需要使用 `GRANT` 语句单独授权。

   这是 MySQL 官方推荐的创建用户的标准方式。

 

2. 使用 `GRANT` 语句 (最常用的方法)

基本语法:

GRANT privilege_type ON database.table TO 'username'@'host' IDENTIFIED BY 'password';

参数说明:

   `privilege_type`:要授予的权限(如 `SELECT`, `INSERT`, `ALL PRIVILEGES`)。

   `ON database.table`:权限作用范围(如 `*.*` 代表所有库所有表,`mydb.*` 代表 `mydb` 库下的所有表)。

   其他参数与 `CREATE USER` 相同。

 

示例 2:创建用户并直接授权

 创建用户 test3,允许从本地登录,密码 test3,并授予对所有数据库的查询权限

GRANT SELECT ON *.* TO 'test3'@'localhost' IDENTIFIED BY 'test3';

 

 创建应用用户,允许从内网网段连接,并授予对特定数据库的全部操作权限

GRANT ALL PRIVILEGES ON `app_db`.* TO 'app_user'@'192.168.1.%' IDENTIFIED BY 'StrongPassword!123';

 

特点:

   创建用户和授权一步完成,是最实用、最高效的方法。

   如果 `'username'@'host'` 不存在,会自动创建该用户。

   在 MySQL 5.7 及以后版本中,此语法已被标记为弃用,但仍然广泛支持。更标准的做法是先 `CREATE USER`,再 `GRANT`。

 

3. 使用 `INSERT INTO` 语句 (不推荐的方法)

基本语法:

INSERT INTO mysql.user (Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject)

VALUES ('hostname', 'username', PASSWORD('password'), '', '', '');

 必须执行以下命令使更改生效

FLUSH PRIVILEGES;

 

示例 3:直接向 user 表插入用户

 向系统权限表直接插入用户记录

INSERT INTO mysql.user (Host, User, authentication_string, ssl_cipher, x509_issuer, x509_subject)

VALUES ('localhost', 'test2', PASSWORD('test2'), '', '', '');

 

 刷新权限,使新用户生效

FLUSH PRIVILEGES;

最佳实践总结

1.  首选方法:使用 `GRANT` 语句,因为它简洁、安全且高效。

2.  标准流程:在要求严格的环境,可采用标准流程:先 `CREATE USER` 创建用户,再用 `GRANT` 授予特定权限。

    CREATE USER 'myuser'@'%' IDENTIFIED BY 'password';

    GRANT SELECT, INSERT, UPDATE ON `mydb`.* TO 'myuser'@'%';

3.  避免操作系统表:永远不要使用 `INSERT INTO mysql.user` 的方法创建用户,除非你非常清楚你在做什么。

4.  密码安全:

       使用强密码。

       在命令行中设置密码时,可以考虑先使用 `SELECT PASSWORD('your_plain_password');` 获取哈希值,然后在语句中使用 `IDENTIFIED BY PASSWORD '*hash_value*'`,以避免在历史记录中留下明文密码。

5.  主机限制:始终指定 `host` 部分,遵循最小权限原则,不要随意使用 `'%'`。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)