MySQL 帳戶名稱包含使用者名稱和主機名稱,這可讓為從不同主機連線且具有相同使用者名稱的使用者建立不同的帳戶。本節說明帳戶名稱的語法,包括特殊值和萬用字元規則。
在大多數方面,帳戶名稱與 MySQL 角色名稱相似,但有一些差異,詳見第 8.2.5 節「指定角色名稱」。
帳戶名稱會出現在 SQL 陳述式中,例如CREATE USER
、GRANT
和 SET PASSWORD
,並遵循下列規則
帳戶名稱語法為
'
。user_name
'@'host_name
'@'
部分是選用的。僅包含使用者名稱的帳戶名稱等同於host_name
''
。例如,user_name
'@'%''me'
等同於'me'@'%'
。如果使用者名稱和主機名稱符合未加引號的識別碼的合法性,則它們不需要加引號。如果
user_name
字串包含特殊字元 (例如空格或-
),或host_name
字串包含特殊字元或萬用字元 (例如.
或%
),則必須使用引號。例如,在帳戶名稱'test-user'@'%.com'
中,使用者名稱和主機名稱部分都需要引號。使用反引號 (
`
)、單引號 ('
) 或雙引號 ("
) 將使用者名稱和主機名稱作為識別碼或字串引起來。如需字串引號和識別碼引號的準則,請參閱第 11.1.1 節「字串常值」和第 11.2 節「結構描述物件名稱」。在SHOW
陳述式結果中,使用者名稱和主機名稱會使用反引號 (`
) 引起來。如果使用者名稱和主機名稱部分已加引號,則必須個別引起來。也就是說,寫成
'me'@'localhost'
,而不是'me@localhost'
。(後者實際上等同於'me@localhost'@'%'
,儘管此行為現在已被棄用。)對
CURRENT_USER
或CURRENT_USER()
函式的參考等同於逐字指定目前用戶端的使用者名稱和主機名稱。
MySQL 會使用個別的欄位,將帳戶名稱儲存在 mysql
系統資料庫中的授權表中,以儲存使用者名稱和主機名稱部分
如需了解更多關於授權表中儲存的使用者名稱和主機名稱屬性(例如最大長度)的詳細資訊,請參閱授權表範圍欄屬性。
使用者名稱和主機名稱具有某些特殊值或萬用字元慣例,如下所述。
帳戶名稱的使用者名稱部分可以是與傳入連線嘗試的使用者名稱完全匹配的非空白值,或與任何使用者名稱匹配的空白值(空字串)。使用者名稱為空白的帳戶是匿名使用者。若要在 SQL 陳述式中指定匿名使用者,請使用加上引號的空白使用者名稱部分,例如 ''@'localhost'
。
帳戶名稱的主機名稱部分可以採用多種形式,並且允許使用萬用字元。
主機值可以是主機名稱或 IP 位址(IPv4 或 IPv6)。名稱
'localhost'
表示本機主機。IP 位址'127.0.0.1'
表示 IPv4 回送介面。IP 位址'::1'
表示 IPv6 回送介面。主機名稱或 IP 位址值中允許使用
%
和_
萬用字元,但此用法已棄用,因此在未來版本的 MySQL 中可能會移除。這些字元的含義與使用LIKE
運算子執行模式比對作業時的含義相同。例如,'%'
的主機值會比對任何主機名稱,而'%.mysql.com'
的值會比對mysql.com
網域中的任何主機。'198.51.100.%'
會比對 198.51.100 C 類網路中的任何主機。由於主機值中允許使用 IP 萬用字元值(例如,
'198.51.100.%'
以比對子網路上的每個主機),因此有人可能會嘗試藉由將主機命名為198.51.100.somewhere.com
來利用此功能。為了阻止此類嘗試,MySQL 不會對以數字和點開頭的主機名稱執行比對。例如,如果主機名稱為1.2.example.com
,則其名稱永遠不會比對帳戶名稱的主機部分。IP 萬用字元值只能比對 IP 位址,而不能比對主機名稱。如果
partial_revokes
設定為ON
,MySQL 會將授權中的%
和_
視為字面字元,而不是萬用字元。無論此變數的值為何,都已棄用這些萬用字元的使用;您應預期此功能將在未來版本的 MySQL 中移除。對於指定為 IPv4 位址的主機值,可以指定網路遮罩,以指示要用於網路號碼的位址位元數。網路遮罩表示法不能用於 IPv6 位址。
語法為
。例如host_ip
/netmask
CREATE USER 'david'@'198.51.100.0/255.255.255.0';
這會使
david
能夠從任何具有 IP 位址client_ip
的用戶端主機連線,且下列條件成立client_ip & netmask = host_ip
也就是說,對於剛才顯示的
CREATE USER
陳述式client_ip & 255.255.255.0 = 198.51.100.0
符合此條件的 IP 位址範圍從
198.51.100.0
到198.51.100.255
。網路遮罩通常以設定為 1 的位元開頭,後面接著設定為 0 的位元。範例
198.0.0.0/255.0.0.0
:198 A 類網路上的任何主機198.51.0.0/255.255.0.0
:198.51 B 類網路上的任何主機198.51.100.0/255.255.255.0
:198.51.100 C 類網路上的任何主機198.51.100.1
:只有具有此特定 IP 位址的主機
指定為 IPv4 位址的主機值可以使用 CIDR 表示法撰寫,例如
198.51.100.44/24
。
伺服器會使用系統 DNS 解析器針對用戶端主機名稱或 IP 位址傳回的值,將帳戶名稱中的主機值與用戶端主機進行比對。除非使用網路遮罩表示法指定帳戶主機值,否則伺服器會以字串比對方式執行此比較,即使針對以 IP 位址給定的帳戶主機值也是如此。這表示您應使用 DNS 使用的相同格式指定帳戶主機值。以下是一些需要注意的問題範例
假設本機網路上的主機具有完整名稱
host1.example.com
。如果 DNS 傳回此主機的名稱查詢結果為host1.example.com
,請在帳戶主機值中使用該名稱。如果 DNS 僅傳回host1
,則改用host1
。如果 DNS 傳回指定主機的 IP 位址為
198.51.100.2
,則該位址會比對198.51.100.2
的帳戶主機值,但不會比對198.051.100.2
。同樣地,它會比對198.51.100.%
之類的帳戶主機模式,但不會比對198.051.100.%
。
為了避免發生這些問題,建議您檢查 DNS 傳回主機名稱和位址的格式。在 MySQL 帳戶名稱中使用相同格式的值。