GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者:YeJinrong/葉金榮 意外發現USER()和CURRENT_USER()的一點不同。 某次在用 ALTER 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
一開始百思不得其解,如果把 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