MySQL创建用户有很多种方法,例如常规create user,再通过grant,授予权限,还可直接grant连带创建用户和授权一起做了。最近创建过程中,发现不同版本操作有些区别。
MySQL 5.7官方手册,给出了创建用户的操作步骤,
https://dev.mysql.com/doc/refman/5.7/en/grant.html
但实际上,grant带着identified by是可以的,
mysql> select version();
+------------+
| version() |
+------------+
| 5.7.32-log |
+------------+
1 row in set (0.02 sec)
mysql> create user test identified by 'test';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all privileges on `mysql`.* to 'test'@'%' identified by 'test';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show grants for 'test'@'%';
+-------------------------------------------------+
| Grants for test@% |
+-------------------------------------------------+
| GRANT USAGE ON *.* TO 'test'@'%' |
| GRANT ALL PRIVILEGES ON `mysql`.* TO 'test'@'%' |
+-------------------------------------------------+
2 rows in set (0.00 sec)
MySQL 8.0官方手册上,给出的操作步骤基本和5.7是相同的,
https://dev.mysql.com/doc/refman/8.0/en/grant.html
但是执行的时候,grant如果加上identified by,就会提示语法存在错误,
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.23 |
+-----------+
1 row in set (0.00 sec)
mysql> create user test identified by 'test';
Query OK, 0 rows affected (0.01 sec)
mysql> grant all privileges on `mysql`.* to 'test'@'%' identified by 'test';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by 'test'' at line 1
其实这对create user和grant分开执行的场景没什么影响,无非是多个少个identified by的问题,但是如果通过grant将创建用户和授权一起执行的场景,就会有些影响,例如5.7中,可以通过grant达到创建用户和授权的效果,当然,这个受sql_mode中的参数NO_AUTO_CREATE_USER的控制,如果指定了,就是允许如下的操作,
mysql> grant all privileges on `mysql`.* to 'testdb'@'%' identified by 'testdb';
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> show grants for 'testdb'@'%';
+---------------------------------------------------+
| Grants for testdb@% |
+---------------------------------------------------+
| GRANT USAGE ON *.* TO 'testdb'@'%' |
| GRANT ALL PRIVILEGES ON `mysql`.* TO 'testdb'@'%' |
+---------------------------------------------------+
2 rows in set (0.00 sec)
但是8.0中,这个操作,就会提示错误,
mysql> grant all privileges on `mysql`.* to 'testdb'@'%' identified by 'testdb';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by 'testdb'' at line 1
这个应该和8.0的特性相关,如文档所说,从8.0.11开始,就删除了sql_mode中NO_AUTO_CREATE_USER参数,
https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html
因此对他来说,这是正常现象。至于设计原因,我猜还是想让用户创建的过程更标准、更加原子性,一个操作,就做一件事,出错的几率,就更可控。
小白学习MySQL,
《小白学习MySQL - 随机插入测试数据的工具》
《小白学习MySQL - varchar类型字段为什么经常定义成255?》
《小白学习MySQL - 变通创建索引的案例一则》
《小白学习MySQL - “投机取巧”统计表的记录数》
《小白学习MySQL - 一次慢SQL的定位》
《小白学习MySQL - TIMESTAMP类型字段非空和默认值属性的影响》
《小白学习MySQL - 聊聊数据备份的重要性》
《小白学习MySQL - InnoDB支持optimize table?》
《小白学习MySQL - table_open_cache的作用》
《小白学习MySQL - 表空间碎片整理方法》
《小白学习MySQL - 大小写敏感问题解惑》
《小白学习MySQL - only_full_group_by的校验规则》
《小白学习MySQL - max_allowed_packet》
《小白学习MySQL - mysqldump保证数据一致性的参数差异》
《小白学习MySQL - 查询会锁表?》
《小白学习MySQL - 索引键长度限制的问题》
《小白学习MySQL - MySQL会不会受到“高水位”的影响?》
《小白学习MySQL - 数据库软件和初始化安装》
《小白学习MySQL - 闲聊聊》
近期更新的文章:
《最近碰到的问题》
《Linux进程信息的检索》
《OCR解析健康宝图片》
《MySQL和Oracle在索引名称唯一性方面的不同设计》
《Linux环境监控工具基础参考》
文章分类和索引:
《公众号900篇文章分类和索引》