MySQL идентифицира потребител както чрез потребителското име, така и чрез хоста. Когато MySQL извършва удостоверяване при влизане, MySQL първо търси име на хост, което е точно съвпадение. Ако не намери точно съвпадение, тогава търси хост, съдържащ '%' заместващ знак.
Когато извършихте GRANT ... TO example@sqldat.com , MySQL създаде нов потребител (без парола, защото нямаше IDENTIFIED BY дадени в изявлението.
Тогава какво се случи, когато се опитахте да влезете като myuser от localhost, mysqld се опита да намери запис, който съответства на 'myuser'@'localhost' в таблицата mysql.user и го намери. И сесията получи привилегиите, присвоени на този потребител.
(За да бъда малко по-точен, mysqld всъщност не разглежда съдържанието на таблицата mysql.user, а това, което наистина гледа структурата в паметта, която е попълнена от таблицата, когато е създадена. Повторно изграждане на структурата на паметта се задейства от оператор GRANT, REVOKE или FLUSH PRIVILEGES.)
Какво се случваше ПРЕДИ да добавите този нов потребител, mysqld търсеше точно съвпадение на потребител и име на хост и не намери. Но намери запис със заместващия знак „%“, така че съвпадна с него, така че сесията получи всички привилегии, предоставени на потребителя „myuser'@'%".
Двамата потребители 'u'@'%' и 'u'@'localhost' са отделни и различни един от друг. Привилегиите трябва да се предоставят на всеки потребител поотделно. Всички привилегии, предоставени на 'u'@'%' се прилага САМО за този потребител, а НЕ за 'u'@'localhost' .