匿名用户真实存在,需用SELECT User,Host FROM mysql.user WHERE User='';查询确认;存在则执行DROP USER ''@'localhost';和DROP USER ''@'127.0.0.1';删除,MySQL 5.7+无需FLUSH PRIVILEGES。

确认匿名用户是否真实存在
PHP 默认不会创建匿名用户,但某些一键安装包(如 XAMPP、MAMP)或手动误操作可能留下 ''@'localhost' 或 ''@'127.0.0.1' 这类用户名为空的账户。直接在 phpMyAdmin 的「用户账户」页搜索 ''(空字符串)往往查不到——因为界面默认过滤空用户名。必须用 SQL 手动查:
SELECT User, Host FROM mysql.user WHERE User = '';
如果返回结果,才说明存在匿名用户;没结果就不用往下做了。
删除匿名用户的正确 SQL 语句
不能只删 User = '',必须同时指定 Host,否则会误删其他用户。常见组合只有两个:
DROP USER ''@'localhost';DROP USER ''@'127.0.0.1';
注意:DROP USER 在 MySQL 5.7+ 会自动回收权限并删除记录;低于 5.7 需额外执行 FLUSH PRIVILEGES;。phpMyAdmin 的「SQL」标签页里逐条运行即可,别合并成一行。
检查 root 用户是否被匿名用户覆盖
匿名用户优先级高于 'root'@'localhost':当客户端用 mysql -u root -h localhost 连接时,MySQL 实际匹配的是 ''@'localhost'(因 host 相同,空用户名排序更靠前)。现象是输入任意密码都登录成功,或提示 Access denied for user 'root'@'localhost' 却能用空用户进。此时删完匿名用户后,务必确认 'root'@'localhost' 的 authentication_string 不为空且 plugin 是 mysql_native_password 或 caching_sha2_password(取决于版本)。
phpMyAdmin 界面无法直接删匿名用户的原因
phpMyAdmin 的「用户账户」页所有操作都基于 User 字段非空的前提,其删除按钮背后拼的是 DROP USER 'xxx'@'yyy',传入空字符串会导致语法错误。这不是 bug,是设计限制。所以必须绕过界面,走 SQL 标签页。另外,有些旧版 phpMyAdmin(4.6 之前)甚至不显示空用户名的记录,连查都查不到——只能靠命令行或上述 SELECT 语句验证。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











