Spec-Zone.ru › MySQL 5.7

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/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: Любой хост в сети класса A 198

    • 198.51.0.0/255.255.0.0: Любой хост в сети класса B 198.51

    • 198.51.100.0/255.255.255.0: Любой хост в сети класса C 198.51.100

    • 198.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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/account-names.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API