- 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
一開始百思不得其解,如果把 USER() 手動替換成對應的賬戶的話,則可以正常執行:
mysql> ALTER USER test@'%' IDENTIFIED WITH ...
Query OK, 0 rows affected (0.10 sec)
如果再改成 CURRENT_USER() 也是可以執行的:
mysql> ALTER USER CURRENT_USER() IDENTIFIED WITH ...
Query OK, 0 rows affected (0.10 sec)
看來是修改密碼時不能呼叫 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() |
+----------------+
| [email protected] |
+----------------+
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 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

技術交流群:
微信:掃碼添加
GreatSQL社區助手微信好友,發送驗證資訊加群,
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/530031.html
標籤:MySQL
