6.2.4 Указание имён учётных записей
Имена учётных записей MySQL состоят из имени пользователя и имени хоста, что позволяет создавать отдельные учётные записи для пользователей с одинаковым именем пользователя, подключающихся с разных хостов. Этот раздел описывает синтаксис имён учётных записей, включая специальные значения и правила подстановок.
Имена учётных записей используются в SQL-запросах, таких как CREATE USER, GRANT и SET
PASSWORD, и подчиняются следующим правилам:
Синтаксис имени учётной записи —
'.user_name'@'host_name'Часть
@'является необязательной. Имя учётной записи, состоящее только из имени пользователя, эквивалентноhost_name''. Например,user_name'@'%''me'эквивалентно'me'@'%'.Имя пользователя и имя хоста не нужно заключать в кавычки, если они являются допустимыми идентификаторами без кавычек. Кавычки необходимо использовать, если строка
user_nameсодержит специальные символы (такие как пробел или-), или строкаhost_nameсодержит специальные символы или символы подстановки (такие как.или%). Например, в имени учётной записи'test-user'@'%.com'как имя пользователя, так и имя хоста требуют кавычек.Заключайте имена пользователей и хостов в кавычки как идентификаторы или как строки, используя обратные кавычки (
`), одинарные кавычки (') или двойные кавычки ("). Справочные материалы по правилам заключения в кавычки строк и идентификаторов см. в Разделе 9.1.1, «Строковые литералы» и Разделе 9.2, «Имена объектов схемы».Части имени пользователя и имени хоста, если они заключены в кавычки, должны быть заключены в кавычки отдельно. То есть напишите
'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-адреса. Они имеют тот же смысл, что и при операциях сопоставления шаблонов с помощью оператора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-адресам, а не именам хостов. -
Для значения хоста, указанного как 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: Любой хост в сети класса A 198198.51.0.0/255.255.0.0: Любой хост в сети класса B 198.51198.51.100.0/255.255.255.0: Любой хост в сети класса C 198.51.100198.51.100.1: Только хост с этим конкретным IP-адресом
Сервер выполняет сопоставление значений хостов в именах учётных записей с хостом-клиентом, используя значение, возвращаемое системным резолвером 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.