1. 程式人生 > >mysql遠端可以登陸本地登陸不了(user表中host欄位的萬用字元%)

mysql遠端可以登陸本地登陸不了(user表中host欄位的萬用字元%)

在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’被使用者對客戶端進行認證。因此,只有使用匿名使用者的空密碼才能登入進資料庫。就會出現下面的情況了。