MySQL identificeert een gebruiker door ZOWEL de gebruikersnaam en de host. Wanneer MySQL de authenticatie uitvoert bij het inloggen, zoekt MySQL eerst naar een hostnaam die exact overeenkomt. Als het geen exacte overeenkomst vindt, zoekt het naar een host met een wildcard '%'.
Toen u de GRANT ... TO [email protected]
, MySQL heeft een nieuwe gebruiker gemaakt (zonder wachtwoord, omdat er geen IDENTIFIED BY
was gegeven in de verklaring.
Wat gebeurde er toen u probeerde in te loggen als myuser
van de localhost, mysqld probeerde een item te vinden dat overeenkwam met 'myuser'@'localhost'
in de mysql.user-tabel en het heeft het gevonden. En de sessie kreeg de privileges toegewezen aan die gebruiker.
(Om iets preciezer te zijn, mysqld kijkt niet echt naar de inhoud van de mysql.user-tabel, maar naar de in-memory structuur, die uit de tabel werd ingevuld toen deze werd gebouwd. Een herbouw van de geheugenstructuur wordt geactiveerd door een GRANT-, een REVOKE- of een FLUSH PRIVILEGES-instructie.)
Wat gebeurde er VOORDAT je die nieuwe gebruiker toevoegde, mysqld was op zoek naar een exacte overeenkomst op gebruiker en hostnaam, en vond er geen. Maar het vond wel een invoer met het jokerteken '%', dus het kwam daarmee overeen, dus de sessie kreeg alle rechten die aan de gebruiker 'mijngebruiker'@'%' waren toegekend.
De twee gebruikers 'u'@'%'
en 'u'@'localhost'
zijn gescheiden en onderscheiden van elkaar. Privileges moeten aan elke gebruiker afzonderlijk worden toegekend. Alle privileges toegekend aan 'u'@'%'
ALLEEN van toepassing op die gebruiker en NIET op 'u'@'localhost'
.