前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL中USER()和CURRENT_USER()的区别

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

作者头像
老叶茶馆
发布2022-12-02 19:25:10
9440
发布2022-12-02 19:25:10
举报
文章被收录于专栏:MySQL修行 | 老叶茶馆

USER()和CURRENT_USER()的一点不同

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
mysql> ALTER USER test@'%' IDENTIFIED WITH ...
Query OK, 0 rows affected (0.10 sec)

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

代码语言:javascript
复制
mysql> ALTER USER CURRENT_USER() IDENTIFIED WITH ...
Query OK, 0 rows affected (0.10 sec)

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

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

  • CURRENT_USER, CURRENT_USER()
代码语言:javascript
复制
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()
代码语言:javascript
复制
Returns the current MySQL user name and host name as 
a string in the utf8 character set.

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

代码语言:javascript
复制
# 有一个授权账户是 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 |
+----------------+

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

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

Enjoy MySQL :)


《深入浅出MGR》视频课程

戳此小程序即可直达B站

https://www.bilibili.com/medialist/play/1363850082?business=space_collection&business_id=343928&desc=0


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老叶茶馆 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档