user()和system_user()相同
user(),system_user(),session_user()一般相同

mysql的user()、session_user()、system_user()、current_user() 有什么区别

在MySQL中,USER(), SESSION_USER(), SYSTEM_USER(), 和 CURRENT_USER() 这些函数通常用于获取当前MySQL会话的用户信息。尽管它们在某些情况下可能返回相同的结果,但它们之间确实存在一些细微的差别,尤其是在处理代理用户和权限时。

  1. USER() 和 SYSTEM_USER()

这两个函数是等价的,它们返回当前MySQL会话的MySQL用户名和主机名。这通常是你在登录时使用的用户名和来源主机。

例如:

SELECT USER();
-- 可能返回 'username@hostname'
  1. SESSION_USER()

这个函数也返回当前会话的用户名和主机名,与USER()SYSTEM_USER()是等价的。所以,在大多数情况下,这三个函数会返回相同的结果。

  1. CURRENT_USER()

这个函数在某些情况下与上述函数有所不同。特别是当MySQL会话使用代理用户进行连接时,CURRENT_USER()会返回代理用户的身份,而USER(), SESSION_USER(), 和 SYSTEM_USER() 会返回原始用户的身份。

代理用户是一个功能,允许一个用户(代理)以另一个用户的身份执行操作。这在某些应用场景中很有用,例如审计或权限管理。

为了更好地理解这些函数之间的区别,你可以考虑以下场景:

假设你有一个名为audit_user的用户,该用户被配置为代理,并允许以其他用户的身份执行操作。当audit_useranother_user的身份连接到MySQL并执行查询时:

  • USER(), SESSION_USER(), 和 SYSTEM_USER() 都会返回 audit_user@hostname
  • CURRENT_USER() 会返回 another_user@hostname

因此,当你需要确保获取的是当前实际执行操作的用户(而不是可能的代理用户)时,使用CURRENT_USER()是有意义的。而在其他情况下,这四个函数中的任何一个通常都可以满足需求。

测试 mysql的user()、session_user()、system_user()、current_user()

测试代码

select user(); select system_user(); select session_user(); select current_user();
SELECT user(); SELECT system_user(); SELECT session_user(); SELECT current_user();
本机
mysql> select user(); select system_user(); select session_user(); select current_user();
+------------------+
| user()           |
+------------------+
| remote@localhost |
+------------------+
1 row in set (0.00 sec)

+------------------+
| system_user()    |
+------------------+
| remote@localhost |
+------------------+
1 row in set (0.00 sec)

+------------------+
| session_user()   |
+------------------+
| remote@localhost |
+------------------+
1 row in set (0.00 sec)

+----------------+
| current_user() |
+----------------+
| remote@%       |
+----------------+
1 row in set (0.00 sec)
mysql> SELECT user(); SELECT system_user(); SELECT session_user(); SELECT current_user();
+------------------+
| user()           |
+------------------+
| remote@localhost |
+------------------+
1 row in set (0.00 sec)

+------------------+
| system_user()    |
+------------------+
| remote@localhost |
+------------------+
1 row in set (0.00 sec)

+------------------+
| session_user()   |
+------------------+
| remote@localhost |
+------------------+
1 row in set (0.00 sec)

+----------------+
| current_user() |
+----------------+
| remote@%       |
+----------------+
1 row in set (0.00 sec)

逐个输入:

mysql> SELECT USER();
+------------------+
| USER()           |
+------------------+
| remote@localhost |
+------------------+
1 row in set (0.00 sec)

mysql> SELECT SYSTEM_USER();
+------------------+
| SYSTEM_USER()    |
+------------------+
| remote@localhost |
+------------------+
1 row in set (0.00 sec)

mysql> SELECT SESSION_USER();
+------------------+
| SESSION_USER()   |
+------------------+
| remote@localhost |
+------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| remote@%       |
+----------------+
1 row in set (0.01 sec)
其它机
mysql> SELECT user(); SELECT system_user(); SELECT session_user(); SELECT current_user();
+----------------+
| user()         |
+----------------+
| remote@1.0.0.1 |
+----------------+
1 row in set (0.00 sec)

+----------------+
| system_user()  |
+----------------+
| remote@1.0.0.1 |
+----------------+
1 row in set (0.00 sec)

+----------------+
| session_user() |
+----------------+
| remote@1.0.0.1 |
+----------------+
1 row in set (0.00 sec)

+----------------+
| current_user() |
+----------------+
| remote@%       |
+----------------+
1 row in set (0.00 sec)

逐个输入

mysql> select user();
+----------------+
| user()         |
+----------------+
| remote@1.0.0.1 |
+----------------+
1 row in set (0.00 sec)

mysql> select system_user();
+----------------+
| system_user()  |
+----------------+
| remote@1.0.0.1 |
+----------------+
1 row in set (0.00 sec)

mysql> select session_user();
+----------------+
| session_user() |
+----------------+
| remote@1.0.0.1 |
+----------------+
1 row in set (0.00 sec)

mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| remote@%       |
+----------------+
1 row in set (0.00 sec)
03-17 17:42