Probablemente tenga un usuario anónimo ''@'localhost' o ''@'127.0.0.1' .
Según el manual :
Cuando son posibles varias coincidencias, el servidor debe determinar cuál de ellas usar. Resuelve este problema de la siguiente manera:(...)
- Cuando un cliente intenta conectarse, el servidor busca en las filas [de la tabla mysql.user] en orden ordenado.
- El servidor usa la primera fila que coincide con el nombre de host y el nombre de usuario del cliente.
(...) El servidor usa reglas de clasificación que ordenan las filas con los valores de Host más específicos primero .Nombres de host literales [como 'localhost'] y las direcciones IP son las más específicas.
Por lo tanto, dicho usuario anónimo "enmascararía" a cualquier otro usuario como '[any_username]'@'%' cuando se conecta desde localhost .
'bill'@'localhost' coincide con 'bill'@'%' , pero coincidiría (p. ej.) ''@'localhost' de antemano.
La solución recomendada es descartar a este usuario anónimo (esto suele ser bueno de todos modos).
Las siguientes ediciones son en su mayoría irrelevantes para la pregunta principal. Estos solo están destinados a responder algunas preguntas planteadas en otros comentarios dentro de este hilo.
Editar 1
Autenticación como 'bill'@'%' a través de un enchufe.
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)
Editar 2
Exactamente la misma configuración, excepto que reactivé la red y ahora creo un usuario anónimo ''@'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)
Editar 3
Misma situación que en la edición 2, ahora proporcionando la contraseña del usuario anónimo.
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)
Conclusión 1, de la edición 1:Uno puede autenticarse como 'bill'@'%' a través de un enchufe.
Conclusión 2, de la edición 2:si uno se conecta a través de TCP o a través de un socket no tiene impacto en el proceso de autenticación (excepto que uno no puede conectarse como nadie más que 'something'@'localhost' a través de un enchufe, obviamente).
Conclusión 3, de la edición 3:aunque especifiqué -ubill , se me ha concedido acceso como usuario anónimo. Esto se debe a las "reglas de clasificación" recomendadas anteriormente. Tenga en cuenta que en la mayoría de las instalaciones predeterminadas, un código anónimo sin contraseña el usuario existe
(y debe asegurarse/quitarse).