O MySQL identifica um usuário pelo nome de usuário e pelo host. Quando o MySQL faz a autenticação no login, o MySQL primeiro procura um nome de host que seja uma correspondência exata. Se não encontrar uma correspondência exata, procurará um host contendo um curinga '%'.
Quando você fez o
GRANT ... TO [email protected]
, MySQL criou um novo usuário (sem senha, porque não havia IDENTIFIED BY
dado na declaração. Então o que aconteceu, quando você tentou fazer login como
myuser
do localhost, o mysqld tentou encontrar uma entrada que correspondesse a 'myuser'@'localhost'
na tabela mysql.user e encontrou. E a sessão obteve os privilégios atribuídos a esse usuário. (Para ser um pouco mais preciso, o mysqld realmente não olha para o conteúdo da tabela mysql.user, o que realmente olha para a estrutura na memória, que foi preenchida a partir da tabela quando foi construída. Uma reconstrução do estrutura de memória é acionada por uma instrução GRANT, REVOKE ou FLUSH PRIVILEGES.)
O que estava acontecendo ANTES de você adicionar esse novo usuário, o mysqld estava procurando por uma correspondência exata no usuário e no nome do host, e não encontrou um. Mas ele encontrou uma entrada com o curinga '%', então correspondeu a isso, então a sessão obteve todos os privilégios concedidos ao usuário 'myuser'@'%'.
Os dois usuários
'u'@'%'
e 'u'@'localhost'
são separados e distintos um do outro. Os privilégios devem ser concedidos a cada usuário individualmente. Quaisquer privilégios concedidos a 'u'@'%'
aplicam-se SOMENTE a esse usuário e NÃO a 'u'@'localhost'
.