• MySQL中USER()和CURRENT_USER()的区别


    • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
    • GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。
    • 作者:YeJinrong/叶金荣

    意外发现USER()和CURRENT_USER()的一点不同。

    某次在用 ALTER USER 想要修改账户密码时,发现执行下面的SQL会报语法错误:

    mysql> ALTER USER USER() IDENTIFIED WITH ...
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'with mysql_native_password by ''' at line 1
    
    • 1
    • 2

    一开始百思不得其解,如果把 USER() 手动替换成对应的账户的话,则可以正常执行:

    mysql> ALTER USER test@'%' IDENTIFIED WITH ...
    Query OK, 0 rows affected (0.10 sec)
    
    • 1
    • 2

    如果再改成 CURRENT_USER() 也是可以执行的:

    mysql> ALTER USER CURRENT_USER() IDENTIFIED WITH ...
    Query OK, 0 rows affected (0.10 sec)
    
    • 1
    • 2

    看来是修改密码时不能调用 USER() 函数,但可以用 CURRENT_USER() 函数,那么这两个函数的区别是什么呢?

    我们来看下文档中的解释:

    • CURRENT_USER, CURRENT_USER()

    Returns the user name and host name combination for
    the MySQL account that the server used to authenticate
    the current client. This account determines your access
    privileges. The return value is a string in the utf8
    character set.

    • USER()

    Returns the current MySQL user name and host name as
    a string in the utf8 character set.

    简言之,CURRENT_USER() 返回的是当前用户所对应的授权账户,而 USER() 返回的是当前连接用户。这么说可能还有点疑惑,看下面的案例吧:

    # 有一个授权账户是 yejr@'%'
    mysql> SELECT HOST,USER FROM mysql.user WHERE user='yejr';
    +------+------+
    | host | user |
    +------+------+
    | %    | yejr |
    +------+------+
        
    # 采用tcp/ip方式连接
    $ mysql -h127.0.0.1 -uyejr -pxx -P3306
    ...
        
    # 调用 USER()
    mysql> SELECT USER();
    +----------------+
    | USER()         |
    +----------------+
    | yejr@127.0.0.1 |
    +----------------+
        
    mysql> SELECT CURRENT_USER();
    +----------------+
    | CURRENT_USER() |
    +----------------+
    | yejr@%         |
    +----------------+
        
    # 换个方式连接
    $ mysql -S/tmp/mysql.sock -uyejr -pxx
    ...
    SELECT USER();
    +----------------+
    | USER()         |
    +----------------+
    | yejr@localhost |
    +----------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    这下看明白了吧,也就是说,同一个授权账户,可能会从不同主机/不同方式连接到MySQL Server端,这时 CURRENT_USER() 返回的是对应的授权账户,而 USER() 返回的就是包含该账户当前连接的客户端地址,从不同主机连接过来后得到的结果也不同。

    这样就可以解释一开始的问题了,为什么不能在修改密码时调用 USER() 函数,而只能用 CURRENT_USER() 函数了。


    Enjoy GreatSQL 😃

    关于 GreatSQL

    GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

    相关链接: GreatSQL社区 Gitee GitHub Bilibili

    GreatSQL社区:

    捉虫活动详情:https://greatsql.cn/thread-97-1-1.html

    社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

    6440

  • 相关阅读:
    【ACM学习】【STL】关联容器的分类
    Fiora一款二次元的Web多人在线网络聊天系统
    癌症研究科学家涉嫌伪造图片,4篇论文被撤稿,老板全身而退
    增量模型和迭代模型的优点与缺点
    Matlab写入nc文件遇到‘Start+count exceeds dimension bound (NC_EEDGE)‘问题的解决办法
    File类中的方法、获取功能的方法合集、判断功能的方法合集、创建、删除功能的方法合集、目录遍历方法合集
    视频融合共享平台LntonCVS视频监控安防系统运用多视频协议建设智慧园区方案
    怎么把图片批量旋转?简单三招就可以实现
    MySQL—索引—基础语法
    如何修改HTTP头部的APACHE标记,隐藏apache服务器标记
  • 原文地址:https://blog.csdn.net/GreatSQL2021/article/details/127753552