阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

如何解决mysql本地登陆不能登录的问题

14次阅读
没有评论

共计 1278 个字符,预计需要花费 4 分钟才能阅读完成。

在 MySQL 数据库中,使用 select user(); 查看当前登陆用户。mysql 中 host 字段的 % 与 localhost 不是谁包括谁的问题,是由精确到模糊进行匹配的。

说明

当用户从客户端请求登陆时,MySQL 将授权表中的条目与客户端所提供的条目进行比较,包括用户的用户名,密码和主机。授权表中的 Host 字段是可以使用通配符作为模式进行匹配的,如 test.example.com, %.example.com, %.com 和 % 都可以匹配 test.example.com 这个主机。授权表中的 User 字段不允许使用模式匹配,但是可以有一个空字符的用户名代表匿名用户,并且空字符串可以匹配所有的用户名,就像通配符一样。当 user 表中的 Host 和 User 有多个值可以匹配客户端提供的主机和用户名时,MySQL 将 user 表读入内存,并且按照一定规则排序,按照排序规则读取到的第一个匹配客户端用户名和主机名的条目对客户端进行身份验证。

排序规则

1. 对于 Host 字段,按照匹配的精确程度进行排序,越精确的排序越前,例如当匹配 test.example.com 这个主机时, %.example.com 比 %.com 更精确,而 test.example.com 比 %.example.com 更精确。
2. 对于 User 字段,非空的字符串用户名比空字符串匹配的用户名排序更靠前。User 和 Host 字段都有多个匹配值,MySQL 使用主机名排序最前的条目,在主机名字段相同时再选取用户名排序更前的条目。因此,如果 User 和 Host 字段都有多个匹配值,主机名最精确匹配的条目被用户对用户进行认证。

转角遇到爱

今天偶遇了 % 不能在本地登录的问题。
官方说 % 不包括 localhost。% 是匹配所有 host 的主机的,但是 MySQL 的 user 匹配 host 是从具体到模糊的,所以如果有 localhost 或 127.0.0.1 存在,就不会去匹配 % 这个用户了。
但是为何本地 mysql -uXXX 可以直接登录,而 mysql -uXXX -pxxxxxx 却登录不了?
答:查看 mysql 库的 user 表,发现 host 为 localhost,用户为 XXX 的 password 为空;而 host 为 %,用户为 XXX 的 password 不为空。
使用 XXX 在本机登录数据时,不指定 - h 参数默认为 localhost 主机登录,而在 MySQL 中有两个匹配的条目:@’%’和”@’localhost’,根据匹配规则,由精确到模糊,于是先匹配上了 host=localhost 这条,于是判断其密码为空。
匿名用户能够匹配的原因上面说过,空字符串可以匹配所有的用户名,就像通配符一样。
根据 MySQL 认证时的排序规则,第一个条目的用户名排序更前,第二个条目的主机名更精确,排序更前。
而 MySQL 会优先使用主机名排序第一的条目进行身份认证,因此”@’localhost’被用户对客户端进行认证。因此,只有使用匿名用户的空密码才能登录进数据库。就会出现下面的情况了。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-11-03发表,共计1278字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中