当我们在终端中使用:mysql -u用户名 -p密码 格式进行登录时,其实有三个关键名控制我们进行登录,即标题中的user、host、password(即新版本authentication_string),相信单独来看这三个大家都比较清楚,但是本机终端登录的时候,默认的host只能是“localhost”,否则无法登录。
什么意思呢?分几点来说:
1、简单来说当某用户对应的host不包含“localhost”在内的话,是无法登录的。
#select user,host from mysql.user;
#如下是通过上面的查询语句查询到的所有mysql的user和host信息。
+------------------+--------------+
| user | host |
+------------------+--------------+
| root | % |
| test | % |
| test2 | 10.36.151.% |
| ceshi | 10.36.151.17 |
| debian-sys-maint | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+--------------+
#里面有两个可能用户可能无法登录:
#1)"test2"@"10.36.151.%",这个代表在10.36.151.*网段的用户才可以登录连接这个用户,如果本地的地址不在这个网段,那么无法登录;
#2)"ceshi"@"10.36.151.17",与上面类似,只有10.36.151.17网址才能登录,其他不可登录。
#报错如下:ERROR 1045 (28000): Access denied for user 'ceshi'@'localhost' (using password: YES)
2、当用户的host包含“localhost”时,登录的用户host总是等于localhost,什么意思呢?如下:
#select user,host from mysql.user;
#如下是通过上面的查询语句查询到的所有mysql的user和host信息。
+------------------+--------------+
| user | host |
+------------------+--------------+
| root | % |
| test | % |
| test2 | 10.36.151.% |
| ceshi | 10.36.151.17 |
| debian-sys-maint | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+--------------+
#我们使用test进行登录:mysql -utest -p
#登录成功后,查看当前的用户:select user();显示的结果是:
+----------------+
| user() |
+----------------+
| test@localhost |
+----------------+
#那么对host其实我们的理解就会又更深了一些,登录的三个关键字实际是:mysql -u "test"@"localhost" -p password
查看官方文档(地址:https://dev.mysql.com/doc/refman/5.7/en/creating-accounts.html)关于这个的说明,有如下一段话:The ‘finley’@‘localhost’ account is necessary if there is an anonymous-user account for localhost. Without the ‘finley’@‘localhost’ account, that anonymous-user account takes precedence when finley connects from the local host and finley is treated as an anonymous user. The reason for this is that the anonymous-user account has a more specific Host column value than the ‘finley’@’%’ account and thus comes earlier in the user table sort order.
有道翻译的结果:如果localhost有一个匿名用户帐户,那么“finley”@“localhost”帐户是必要的。如果没有“finley”@“localhost”帐户,当finley从本地主机连接并且finley被视为匿名用户时,匿名用户帐户将优先。这样做的原因是,匿名用户帐户具有比’finley’@’%'帐户更具体的主机列值,因此在用户表排序顺序中更早。
所以其中的一些问题,细细回味可以知道,本地host的值就是localhost,至于其他值则在远程连接时会有涉及。