Probabilmente hai un utente anonimo ''@'localhost' o ''@'127.0.0.1' .
Come da il manuale :
Quando sono possibili più corrispondenze, il server deve determinare quale di esse utilizzare. Risolve questo problema come segue:(...)
- Quando un client tenta di connettersi, il server esamina le righe [della tabella mysql.user] in ordine.
- Il server utilizza la prima riga che corrisponde al nome host e al nome utente del client.
(...)Il server utilizza regole di ordinamento che ordinano le righe con prima i valori Host più specifici .Nomi host letterali [come 'localhost'] e gli indirizzi IP sono i più specifici.
Quindi, un tale utente anonimo "maschererebbe" qualsiasi altro utente come '[any_username]'@'%' quando ci si connette da localhost .
'bill'@'localhost' corrisponde a 'bill'@'%' , ma corrisponderebbe (ad es.) a ''@'localhost' in anticipo.
La soluzione consigliata è quella di eliminare questo utente anonimo (questa di solito è comunque una buona cosa da fare).
Le modifiche di seguito sono per lo più irrilevanti per la domanda principale. Questi hanno solo lo scopo di rispondere ad alcune domande sollevate in altri commenti all'interno di questo thread.
Modifica 1
Autenticazione come 'bill'@'%' tramite una presa.
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)
Modifica 2
Stessa identica configurazione, tranne per il fatto che ho riattivato la rete e ora creo un utente anonimo ''@'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)
Modifica 3
Stessa situazione della modifica 2, ora fornendo la password dell'utente anonimo.
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)
Conclusione 1, dalla modifica 1:ci si può autenticare come 'bill'@'%' tramite una presa.
Conclusione 2, dalla modifica 2:se ci si connette tramite TCP o tramite un socket non ha alcun impatto sul processo di autenticazione (tranne che non si può connettersi come nessun altro tranne 'something'@'localhost' tramite una presa, ovviamente).
Conclusione 3, dalla modifica 3:anche se ho specificato -ubill , mi è stato concesso l'accesso come utente anonimo. Ciò è dovuto alle "regole di ordinamento" consigliate sopra. Si noti che nella maggior parte delle installazioni predefinite, un anonimo senza password l'utente esiste
(e dovrebbe essere protetto/rimosso).