我在下面的问题中遇到了与OP相同的问题,并且其中包含了'那里的答案为我解决了。现在我想了解原因,但我不允许发表我的后续问题作为对他答案的评论。
我特别想知道的是,为什么有必要为来自"任何主机"的用户提供两个单独的条目。和localhost。应该"任何主持人"不包括localhost?
答案 0 :(得分:0)
在读取mysql manual section连接访问后,我的猜测是因为mysql在用户之前与主机匹配,而%是最不相关的。
因此,当查找用户时,mysql首先查找主机,并且只有在找不到该主机的匹配用户时才查找用户@%。
相关段落是:
+----------------+----------+-
| Host | User | ...
+----------------+----------+-
| thomas.loc.gov | | ...
| % | jeffrey | ...
+----------------+----------+-
来自thomas.loc.gov的jeffrey连接与第一行匹配,而来自任何主机的jeffrey连接与第二行匹配。
注意:
一种常见的误解是,对于给定的用户名,当服务器尝试查找连接匹配时,首先使用显式命名该用户的所有行。这不是真的。前面的例子说明了这一点,其中来自jeffrey的thomas.loc.gov的连接首先不是由包含'jeffrey'作为User列值的行匹配,而是由没有用户名的行匹配。因此,jeffrey被认证为匿名用户,即使他在连接时指定了用户名。
因此,用户@localhost(即匿名)将优先于用户@%。
如果没有指定匿名用户@localhost,则用户@%也应该包含user @ localhost,但除了user @%之外,显式指定user @ localhost似乎是更可靠的选项。