8.2.4 Указание имён учётных записей
Имена учётных записей 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, используя отдельные столбцы для имени пользователя и имени хоста:
Таблица
userсодержит по одной строке для каждой учётной записи. СтолбцыUserиHostхранят имя пользователя и имя хоста. Эта таблица также указывает, какими глобальными привилегиями обладает учётная запись.Другие таблицы разрешений указывают привилегии учётной записи для баз данных и объектов внутри баз данных. Эти таблицы имеют столбцы
UserиHostдля хранения имени учётной записи. Каждая строка в этих таблицах ассоциируется с учётной записью в таблицеuser, имеющей одинаковые значенияUserиHost.-
Для целей проверки доступа сравнения значений User чувствительны к регистру. Сравнения значений Host нечувствительны к регистру.
Дополнительные сведения о свойствах имён пользователей и имён хостов, хранящихся в таблицах разрешений, таких как максимальная длина, см. в Свойства столбцов области таблицы разрешений.
Имена пользователей и имена хостов имеют определённые специальные значения или соглашения об использовании подстановочных символов, как описано ниже.
Часть имени пользователя имени учётной записи — это либо ненулевое значение, которое буквально соответствует имени пользователя для попыток входящего подключения, либо пустое значение (пустая строка), которое соответствует любому имени пользователя. Учётная запись с пустым именем пользователя — это анонимный пользователь. Чтобы указать анонимного пользователя в операторах 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.%'соответствует любому хосту в сети класса C 198.51.100.Поскольку 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/netmaskCREATE 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.0IP-адреса, удовлетворяющие этому условию, находятся в диапазоне от
198.51.100.0до198.51.100.255.Маска подсети обычно начинается с установленных в 1 битов, за которыми следуют установленные в 0 биты. Примеры:
198.0.0.0/255.0.0.0: Любой хост в сети класса А 198198.51.0.0/255.255.0.0: Любой хост в сети класса В 198.51198.51.100.0/255.255.255.0: Любой хост в сети класса С 198.51.100198.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.
© 2025 Oracle
Licensed under the GPLv2 License.