MySQL identifica un utente SIA il nome utente che l'host. Quando MySQL esegue l'autenticazione all'accesso, MySQL cerca prima un nome host che corrisponda esattamente. Se non trova una corrispondenza esatta, cerca un host contenente un carattere jolly '%'.
Quando hai fatto il GRANT ... TO [email protected]
, MySQL ha creato un nuovo utente (senza password, perché non c'era IDENTIFIED BY
indicato nella dichiarazione.
Poi cosa è successo, quando hai tentato di accedere come myuser
da localhost, mysqld ha cercato di trovare una voce che corrispondesse a 'myuser'@'localhost'
nella tabella mysql.user e l'ha trovato. E la sessione ha ottenuto i privilegi assegnati a quell'utente.
(Per essere un po' più precisi, mysqld in realtà non guarda il contenuto della tabella mysql.user, cosa guarda davvero alla struttura in memoria, che è stata popolata dalla tabella quando è stata costruita. Una ricostruzione del la struttura della memoria viene attivata da un'istruzione GRANT, REVOKE o FLUSH PRIVILEGES.)
Cosa stava succedendo PRIMA che tu aggiungessi quel nuovo utente, mysqld stava cercando una corrispondenza esatta tra utente e nome host e non l'ha trovata. Ma ha trovato una voce con il carattere jolly '%', quindi corrispondeva a quello, quindi la sessione ha ottenuto tutti i privilegi concessi all'utente 'myuser'@'%'.
I due utenti 'u'@'%'
e 'u'@'localhost'
sono separati e distinti l'uno dall'altro. I privilegi devono essere concessi a ciascun utente individualmente. Eventuali privilegi concessi a 'u'@'%'
applica SOLO a quell'utente e NON a 'u'@'localhost'
.