1.MySQL 创建用户

语法格式:

CREATE USER <用户名> [ IDENTIFIED ] BY [ PASSWORD ] <口令>

语法说明如下:

1) <用户名>
指定创建用户账号,格式为 'user_name'@'host_name'。这里user_name是用户名,host_name为主机名,即用户连接 MySQL 时所在主机的名字。
若在创建的过程中,只给出了账户的用户名,而没指定主机名,则主机名默认为“%”,表示一组主机。
2) PASSWORD
可选项,用于指定散列口令,即若使用明文设置口令,则需忽略PASSWORD关键字;
若不想以明文设置口令,且知道 PASSWORD() 函数返回给密码的散列值,则可以在口令设置语句中指定此散列值,但需要加上关键字PASSWORD。
3) IDENTIFIED BY子句
用于指定用户账号对应的口令,若该用户账号无口令,则可省略此子句。
4) <口令>
指定用户账号的口令,在IDENTIFIED BY关键字或PASSWOED关键字之后。
给定的口令值可以是只由字母和数字组成的明文,也可以是通过 PASSWORD() 函数得到的散列值。

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

  • 如果使用 CREATE USER 语句时没有为用户指定口令,那么 MySQL
    允许该用户可以不使用口令登录系统,然而从安全的角度而言,不推荐这种做法。
  • 使用 CREATE USER 语句必须拥有 MySQL 中 MySQL 数据库的 INSERT 权限或全局 CREATE USER 权限。
  • 使用 CREATE USER 语句创建一个用户账号后,会在系统自身的 MySQL 数据库的 user
    表中添加一条新记录。若创建的账户已经存在,则语句执行时会出现错误。
  • 新创建的用户拥有的权限很少。他们可以登录 MySQL,只允许进行不需要权限的操作,如使用 SHOW 语句查询所有存储引擎和字符集的列表等。

如果两个用户具有相同的用户名和不同的主机名,MySQL 会将他们视为不同的用户,并允许为这两个用户分配不同的权限集合。

【实例 1】使用 CREATE USER 创建一个用户,用户名是 james,密码是 tiger,主机是 localhost。输入的 SQL 语句和执行过程如下所示。

mysql> CREATE USER 'james'@'localhost' IDENTIFIED BY 'tiger';
Query OK, 0 rows affected (0.12 sec)

在 Windows 命令行工具中,使用新创建的用户 james 和密码 tiger 登录数据库服务器,如下所示。

C:\Users\USER>mysql -h localhost -u james -p
Enter password: *****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.20-log MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

2.MySQL 的创建用户和授权:这是标准的做法

mysql> create user user_test identified by '123456';  或指定主机
mysql> create user user_test@'1.1.1.1'  identified by '123456'; 
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> 
mysql> select * from mysql.user;
+-----------+---------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+-------------+------------------+--------------+-----------------+------------------+------------------+----------------+-----------------------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------
| Host      | User          | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdo_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | Create_view_priv | Show_view_priv | Create_routine_pr09_subject | max_questions | max_updates | max_connections | max_user_connections | plugin                | authentication_string   
+-----------+---------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+-------------+------------------+--------------+-----------------+------------------+------------------+----------------+-----------------------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------
| localhost | root          | Y           | Y           | Y           | Y           | Y           | Y         | Y           | Y           | Y                | Y            | Y               | Y                | Y                | Y              | Y                           |             0 |           0 |               0 |                    0 | mysql_native_password | *847F22511E63C7ACE6146E8
| localhost | mysql.session | N           | N           | N           | N           | N           | N         | N           | N           | N                | N            | N               | N                | N                | N              | N                           |             0 |           0 |               0 |                    0 | mysql_native_password | *THISISNOTAVALIDPASSWORD
| localhost | mysql.sys     | N           | N           | N           | N           | N           | N         | N           | N           | N                | N            | N               | N                | N                | N              | N                           |             0 |           0 |               0 |                    0 | mysql_native_password | *THISISNOTAVALIDPASSWORD
| %         | root          | Y           | Y           | Y           | Y           | Y           | Y         | Y           | Y           | Y                | Y            | Y               | Y                | Y                | Y              | Y                           |             0 |           0 |               0 |                    0 | mysql_native_password | *847F22511E63C7ACE6146E8
| localhost | doggggggg     | N           | N           | N           | N           | N           | N         | N           | N           | N                | N            | N               | N                | N                | N              | N                           |             0 |           0 |               0 |                    0 | mysql_native_password | *847F22511E63C7ACE6146E8
| %         | admin_test    | Y           | Y           | Y           | Y           | Y           | Y         | Y           | Y           | Y                | Y            | Y               | Y                | Y                | Y              | Y                           |             0 |           0 |               0 |                    0 | mysql_native_password | *50378C3B9EBAEEC633B913A
| %         | user_test     | N           | N           | N           | N           | N           | N         | N           | N           | N                | N            | N               | N                | N                | N              | N                           |             0 |           0 |               0 |                    0 | mysql_native_password | *847F22511E63C7ACE6146E8
+-----------+---------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+-------------+------------------+--------------+-----------------+------------------+------------------+----------------+-----------------------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------
7 rows in set (0.00 sec)
mysql>		
mysql>
mysql> # 因为 mysql.user 表中的 Host 列是 localhost, 
mysql> # 所以在执行授权的命令要想成功必须严格匹配 mysql.user 表中 <user_name>@<host>
mysql> # 如果是对 *.* 授权,则查询 mysql.user 即可看到授权结果
mysql> # 如果是对 robdb.* 授权,则查询 mysql.db 即可看到授权结果
mysql>
mysql> GRANT SELECT on robertdb.* To 'user_test'@'192.168.56.101';    
ERROR 1133 (42000): Can't find any matching row in the user table
mysql> 
mysql>
mysql> GRANT SELECT on *.* To 'user_test'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> 
mysql>

3. GRANT 语句是否隐含创建用户,取决于 grant 的写法, 和环境变量 sql_mode

mysql> GRANT SELECT  ON *.* To 'aaaa'@'%';  ---创建失败,因为 sql_mode 中 NO_AUTO_CREATE_USER 不允许创建没有密码的用户, 解决办法是添加一个indentified 子句
ERROR 1133 (42000): Can't find any matching row in the user table
mysql> 
mysql> 
mysql> GRANT SELECT  ON *.* To 'aaaa'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> 
mysql> 
mysql> show variables like '%mode%';
+--------------------------+----------------------------------------------------------------+
| Variable_name            | Value                                                          |
+--------------------------+----------------------------------------------------------------+
| block_encryption_mode    | aes-128-ecb                                                    |
| gtid_mode                | OFF                                                            |
| innodb_autoinc_lock_mode | 1                                                              |
| innodb_strict_mode       | ON                                                             |
| offline_mode             | OFF                                                            |
| pseudo_slave_mode        | OFF                                                            |
| rbr_exec_mode            | STRICT                                                         |
| slave_exec_mode          | STRICT                                                         |
| sql_mode                 | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------+----------------------------------------------------------------+
9 rows in set, 1 warning (0.02 sec)
mysql>

以前一直使用如下面的语句给mysql服务器添加用户:

grant CREATE, DROP,INSERT, SELECT, DELETE, UPDATE,ALTER on xxx.* to xxx; 
grant CREATE, DROP,INSERT, SELECT, DELETE, UPDATE,ALTER on xxx.* to xxx@localhost; 
set password for xxx@'%' = password(xxx); 
set password for xxx@'localhost' = password(xxx); 
flush privileges;

谁知道今天在另一个Mysql服务器上照葫芦画瓢出了问题,抱错说:
ERROR 1133 (42000): Can’t find any matching row in the user table
原来Mysql还有一个模式控制这个,那就是NO_AUTO_CREATE_USER模式。