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 帳戶名稱中使用相同格式的值。