MySQL使用CURRENT_USER()过滤mysql.user表返回空集问题求助
原因说明
current_user() 函数返回的是MySQL用于权限校验的完整身份字符串,格式为用户名@主机名,比如你用root从本地登录时返回值为root@localhost。而你筛选的mysql.user表的user字段仅存储纯用户名(也就是root),两边值格式不匹配,因此查询不到结果。
正确查询方案
方案1:拆分字段匹配(推荐,性能更优)
拆分current_user()的返回值,分别匹配user和host两个字段,避免同用户名不同主机的匹配错误:
SELECT * FROM mysql.user WHERE user = SUBSTRING_INDEX(CURRENT_USER(), '@', 1) AND host = SUBSTRING_INDEX(CURRENT_USER(), '@', -1);
方案2:拼接字段匹配
将mysql.user表的user和host字段拼接后和current_user()返回值直接匹配:
SELECT * FROM mysql.user WHERE CONCAT(user, '@', host) = CURRENT_USER();
补充说明
你可以先单独执行SELECT CURRENT_USER();查看当前身份的返回值,再执行SELECT user, host FROM mysql.user;查看系统表存储的身份格式,即可直观验证两者的差异。
另外注意不要混淆user()和current_user():user()返回的是当前连接的实际客户端地址(比如root@192.168.1.10),而current_user()返回的是MySQL权限校验时匹配到的身份,查询系统权限表时使用current_user()才是准确的。
内容的提问来源于stack exchange,提问作者Tom Kustermans
相关产品推荐
相关产品推荐

