Вероятно имате анонимен потребител ''@'localhost' или ''@'127.0.0.1' .
Съгласно ръководството :
Когато са възможни множество съвпадения, сървърът трябва да определи кое от тях да използва. Той решава този проблем, както следва:(...)
- Когато клиент се опита да се свърже, сървърът преглежда редовете [на таблица mysql.user] в сортиран ред.
- Сървърът използва първия ред, който съответства на името на хоста на клиента и потребителското име.
(...)Сървърът използва правила за сортиране, които подреждат редове с първо най-специфичните стойности на хоста .Литерални имена на хост [като 'localhost'] и IP адресите са най-конкретни.
Следователно такъв анонимен потребител би "маскирал" всеки друг потребител като '[any_username]'@'%' при свързване от localhost .
'bill'@'localhost' отговаря на 'bill'@'%' , но ще съвпада (напр.) ''@'localhost' предварително.
Препоръчителното решение е да премахнете този анонимен потребител (така или иначе това обикновено е добре).
Редакциите по-долу са предимно неотносими към основния въпрос. Те са предназначени само да отговорят на някои въпроси, повдигнати в други коментари в тази тема.
Редактиране 1
Удостоверяване като 'bill'@'%' през контакт.
example@sqldat.com:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket=/tmp/mysql-5.5.sock
Welcome to the MySQL monitor (...)
mysql> SELECT user, host FROM mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| bill | % |
| root | 127.0.0.1 |
| root | ::1 |
| root | localhost |
+------+-----------+
4 rows in set (0.00 sec)
mysql> SELECT USER(), CURRENT_USER();
+----------------+----------------+
| USER() | CURRENT_USER() |
+----------------+----------------+
| example@sqldat.com | example@sqldat.com% |
+----------------+----------------+
1 row in set (0.02 sec)
mysql> SHOW VARIABLES LIKE 'skip_networking';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| skip_networking | ON |
+-----------------+-------+
1 row in set (0.00 sec)
Редактиране 2
Точно същата настройка, с изключение на това, че активирах отново работата в мрежа и сега създавам анонимен потребител ''@'localhost' .
example@sqldat.com:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql
Welcome to the MySQL monitor (...)
mysql> CREATE USER ''@'localhost' IDENTIFIED BY 'anotherpass';
Query OK, 0 rows affected (0.00 sec)
mysql> Bye
example@sqldat.com:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
--socket=/tmp/mysql-5.5.sock
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
example@sqldat.com:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-h127.0.0.1 --protocol=TCP
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
example@sqldat.com:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-hlocalhost --protocol=TCP
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
Редактиране 3
Същата ситуация като в редакция 2, сега предоставя паролата на анонимния потребител.
example@sqldat.com:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
Welcome to the MySQL monitor (...)
mysql> SELECT USER(), CURRENT_USER();
+----------------+----------------+
| USER() | CURRENT_USER() |
+----------------+----------------+
| example@sqldat.com | @localhost |
+----------------+----------------+
1 row in set (0.01 sec)
Заключение 1, от редакция 1:Човек може да се удостовери като 'bill'@'%' през контакт.
Заключение 2, от редакция 2:Дали човек се свързва чрез TCP или чрез сокет няма влияние върху процеса на удостоверяване (освен не може да се свърже като всеки друг освен 'something'@'localhost' през гнездо, очевидно).
Заключение 3, от редакция 3:Въпреки че посочих -ubill , получих достъп като анонимен потребител. Това се дължи на "правилата за сортиране", препоръчани по-горе. Забележете, че в повечето инсталации по подразбиране без парола, анонимен потребител съществува
(и трябва да бъде защитен/премахнат).