Spec-Zone.ru › MySQL 8.4

15.7.6.1 Синтаксис SET для присваивания переменным

SET variable = expr [, variable = expr] ...

variable: {
    user_var_name
  | param_name
  | local_var_name
  | {GLOBAL | @@GLOBAL.} system_var_name
  | {PERSIST | @@PERSIST.} system_var_name
  | {PERSIST_ONLY | @@PERSIST_ONLY.} system_var_name
  | [SESSION | @@SESSION. | @@] system_var_name
}

Синтаксис SET для присваивания переменным позволяет назначить значения различным типам переменных, которые влияют на работу сервера или клиентов:

  • Переменные, определённые пользователем. См. раздел 11.4, «Переменные, определённые пользователем».

  • Параметры и локальные переменные хранимых процедур и функций. См. раздел 15.6.4, «Переменные в хранимых программах».

  • Системные переменные. См. раздел 7.1.8, «Системные переменные сервера». Системные переменные также могут быть установлены при запуске сервера, как описано в разделе 7.1.9, «Использование системных переменных».

Оператор SET, который присваивает значения переменным, не записывается в бинарный журнал, поэтому в сценариях репликации он влияет только на хост, на котором вы его выполняете. Чтобы повлиять на все хосты репликации, выполните оператор на каждом хосте.

В следующих разделах описывается синтаксис SET для установки переменных. Они используют оператор присваивания =, но также допускается оператор присваивания := для этой цели.

  • Присваивание переменным, определённым пользователем

  • Присваивание параметров и локальных переменных

  • Присваивание системным переменным

  • Обработка ошибок SET

  • Присваивание множеству переменных

  • Ссылки на системные переменные в выражениях

Присваивание переменным, определённым пользователем

Переменные, определённые пользователем, создаются локально в сеансе и существуют только в контексте этого сеанса; см. раздел 11.4, «Переменные, определённые пользователем».

Переменная, определённая пользователем, записывается как @var_name и ей присваивается значение выражения следующим образом:

SET @var_name = expr;

Примеры:

SET @name = 43;
SET @total_tax = (SELECT SUM(tax) FROM taxable_transactions);

Как показано в этих операторах, expr может варьироваться от простого (литеральное значение) до более сложного (значение, возвращаемое скалярным подзапросом).

Таблица user_variables_by_thread схемы Performance содержит информацию о переменных, определённых пользователем. См. раздел 29.12.10, «Таблицы переменных, определённых пользователем, Performance Schema».

Присваивание параметров и локальных переменных

SET применяется к параметрам и локальным переменным в контексте хранимого объекта, в котором они определены. Следующая процедура использует параметр процедуры increment и локальную переменную counter:

CREATE PROCEDURE p(increment INT)
BEGIN
  DECLARE counter INT DEFAULT 0;
  WHILE counter < 10 DO
    -- ... do work ...
    SET counter = counter + increment;
  END WHILE;
END;
Назначение системных переменных

Сервер MySQL поддерживает системные переменные, которые конфигурируют его работу. Системная переменная может иметь глобальное значение, влияющее на работу сервера в целом, сессионное значение, влияющее на текущую сессию, или оба значения. Многие системные переменные динамические и могут быть изменены во время выполнения с помощью оператора SET для воздействия на работу текущего экземпляра сервера. SET также может использоваться для сохранения некоторых системных переменных в файл mysqld-auto.cnf в каталоге данных, чтобы повлиять на работу сервера при последующих запусках.

Если оператор SET выдан для чувствительной системной переменной, запрос переписывается, чтобы заменить значение на “<redacted>” перед его записью в общий журнал и журнал аудита. Это происходит даже в том случае, если на экземпляре сервера не доступно защищенное хранение через компонент ключа.

Если вы изменяете сессионную системную переменную, значение сохраняется в вашей сессии до тех пор, пока вы не измените переменную на другое значение или сессия не закончится. Изменение не влияет на другие сессии.

Если вы изменяете глобальную системную переменную, значение запоминается и используется для инициализации сессионного значения для новых сессий до тех пор, пока вы не измените переменную на другое значение или сервер не завершит работу. Изменение видно для любого клиента, который обращается к глобальному значению. Однако изменение влияет на соответствующее сессионное значение только для клиентов, подключающихся после изменения. Изменение глобальной переменной не влияет на сессионное значение для любых текущих сессий клиентов (даже для сессии, в которой произошло изменение глобального значения).

Чтобы сделать настройку глобальной системной переменной постоянной, чтобы она применялась при перезапуске сервера, вы можете сохранить ее в файл mysqld-auto.cnf в каталоге данных. Также возможно внести постоянные изменения в конфигурацию, вручную изменив файл my.cnf, но это более сложно, и ошибка в вручную введенной настройке может не быть обнаружена до тех пор, пока не произойдет какое-нибудь другое действие. SET операторы, которые сохраняют системные переменные, более удобны и избегают возможности неправильных настроек, так как настройки со синтаксическими ошибками не выполняются и не изменяют конфигурацию сервера. Для получения дополнительной информации о сохранении системных переменных и файле mysqld-auto.cnf, см. Раздел 7.1.9.3, «Сохраненные системные переменные».

Примечание

Установка или сохранение глобального значения системной переменной всегда требует специальных привилегий. Установка значения сессионной системной переменной обычно не требует специальных привилегий и может быть выполнена любым пользователем, хотя есть исключения. Для получения дополнительной информации см. Раздел 7.1.9.1, «Привилегии системных переменных».

В следующем обсуждении описываются варианты синтаксиса для установки и сохранения системных переменных:

  • Чтобы присвоить значение глобальной системной переменной, добавьте ключевое слово GLOBAL или квалификатор @@GLOBAL. перед именем переменной:

    SET GLOBAL max_connections = 1000;
    SET @@GLOBAL.max_connections = 1000;
    
  • Чтобы присвоить значение сессионной системной переменной, добавьте ключевое слово SESSION или LOCAL, квалификатор @@SESSION., @@LOCAL. или @@, или не добавляйте ключевое слово или модификатор:

    SET SESSION sql_mode = 'TRADITIONAL';
    SET LOCAL sql_mode = 'TRADITIONAL';
    SET @@SESSION.sql_mode = 'TRADITIONAL';
    SET @@LOCAL.sql_mode = 'TRADITIONAL';
    SET @@sql_mode = 'TRADITIONAL';
    SET sql_mode = 'TRADITIONAL';
    

    Клиент может изменять свои собственные сессионные переменные, но не переменные других клиентов.

  • Чтобы сохранить глобальную системную переменную в файл mysqld-auto.cnf конфигурации в каталоге данных, добавьте ключевое слово PERSIST или квалификатор @@PERSIST. перед именем переменной:

    SET PERSIST max_connections = 1000;
    SET @@PERSIST.max_connections = 1000;
    

    Этот SET синтаксис позволяет вносить изменения в конфигурацию во время выполнения, которые также сохраняются при перезапуске сервера. Как и SET GLOBAL, SET PERSIST устанавливает текущее значение глобальной переменной, но также записывает настройку переменной в файл mysqld-auto.cnf (заменяя любое существующее значение переменной, если оно есть).

  • Чтобы сохранить глобальную системную переменную в файл mysqld-auto.cnf без установки текущего значения глобальной переменной, добавьте ключевое слово PERSIST_ONLY или квалификатор @@PERSIST_ONLY. перед именем переменной:

    SET PERSIST_ONLY back_log = 100;
    SET @@PERSIST_ONLY.back_log = 100;
    

    Как и PERSIST, PERSIST_ONLY записывает настройку переменной в файл mysqld-auto.cnf. Однако, в отличие от PERSIST, PERSIST_ONLY не изменяет текущее значение глобальной переменной. Это делает PERSIST_ONLY подходящим для конфигурирования только для чтения системных переменных, которые могут быть установлены только при запуске сервера.

Чтобы установить значение глобальной системной переменной до значения по умолчанию MySQL или сессионной системной переменной до текущего соответствующего глобального значения, установите переменную в значение DEFAULT. Например, следующие два оператора идентичны по установке сессионного значения max_join_size до текущего глобального значения:

SET @@SESSION.max_join_size = DEFAULT;
SET @@SESSION.max_join_size = @@GLOBAL.max_join_size;

Использование SET для сохранения глобальной системной переменной в значение DEFAULT или до её значения по умолчанию присваивает переменной значение по умолчанию и добавляет настройку переменной в файл mysqld-auto.cnf. Чтобы удалить переменную из файла, используйте оператор RESET PERSIST.

Некоторые системные переменные не могут быть сохранены или ограничены при сохранении. См. Раздел 7.1.9.4, «Несохраняемые и ограниченные системные переменные».

Системная переменная, реализованная плагином, может быть сохранена, если плагин установлен, когда выполняется оператор SET. Назначение сохраненной переменной плагина вступает в силу для последующих перезапусков сервера, если плагин все еще установлен. Если плагин больше не установлен, переменная плагина больше не существует, когда сервер считывает файл mysqld-auto.cnf. В этом случае сервер записывает предупреждение в журнал ошибок и продолжает работу:

currently unknown variable 'var_name'
was read from the persisted config file

Чтобы отобразить имена и значения системных переменных:

  • Используйте оператор SHOW VARIABLES; см. Раздел 15.7.7.41, «Оператор SHOW VARIABLES».

  • Несколько таблиц Performance Schema предоставляют информацию о системных переменных. См. Раздел 29.12.14, «Таблицы Performance Schema системных переменных».

  • Таблица Performance Schema variables_info содержит информацию о том, когда и каким пользователем каждая системная переменная была в последний раз установлена. См. Раздел 29.12.14.2, «Таблица Performance Schema variables_info».

  • Таблица Performance Schema persisted_variables предоставляет интерфейс SQL для файла mysqld-auto.cnf, что позволяет просматривать его содержимое во время выполнения с помощью операторов SELECT. См. Раздел 29.12.14.1, «Таблица Performance Schema persisted_variables».

Обработка ошибок SET

Если присвоение значения переменной в операторе SET завершается ошибкой, весь оператор считается ошибочным, и никакие переменные не изменяются, а также не изменяется файл mysqld-auto.cnf.

Оператор SET генерирует ошибку в описанных выше обстоятельствах. Большинство примеров демонстрируют операторы SET с использованием ключевого синтаксиса (например, GLOBAL или SESSION), но принципы также справедливы для операторов с соответствующими модификаторами (например, @@GLOBAL. или @@SESSION.).

  • Использование SET (любой вариант) для присвоения значения только для чтения:

    mysql> SET GLOBAL version = 'abc';
    ERROR 1238 (HY000): Variable 'version' is a read only variable
    
  • Использование GLOBAL, PERSIST или PERSIST_ONLY для присвоения значения переменной, имеющей только сессионное значение:

    mysql> SET GLOBAL sql_log_bin = ON;
    ERROR 1228 (HY000): Variable 'sql_log_bin' is a SESSION
    variable and can't be used with SET GLOBAL
    
  • Использование SESSION для присвоения значения переменной, имеющей только глобальное значение:

    mysql> SET SESSION max_connections = 1000;
    ERROR 1229 (HY000): Variable 'max_connections' is a
    GLOBAL variable and should be set with SET GLOBAL
    
  • Опускание GLOBAL, PERSIST или PERSIST_ONLY для присвоения значения переменной, имеющей только глобальное значение:

    mysql> SET max_connections = 1000;
    ERROR 1229 (HY000): Variable 'max_connections' is a
    GLOBAL variable and should be set with SET GLOBAL
    
  • Использование PERSIST или PERSIST_ONLY для присвоения значения переменной, которая не может быть сохранена:

    mysql> SET PERSIST port = 3307;
    ERROR 1238 (HY000): Variable 'port' is a read only variable
    mysql> SET PERSIST_ONLY port = 3307;
    ERROR 1238 (HY000): Variable 'port' is a non persistent read only variable
    
  • Модификаторы @@GLOBAL., @@PERSIST., @@PERSIST_ONLY., @@SESSION. и @@ применяются только к системным переменным. Попытка их применения к пользовательским переменным, параметрам хранимых процедур или функций, или локальным переменным хранимых программ приводит к ошибке.

  • Не все системные переменные могут быть присвоены значению DEFAULT. В таких случаях присвоение DEFAULT приводит к ошибке.

  • Попытка присвоить DEFAULT пользовательским переменным, параметрам хранимых процедур или функций, или локальным переменным хранимых программ приводит к ошибке.

Присвоение значений нескольким переменным

Оператор SET может содержать несколько присваиваний, разделенных запятыми. Этот оператор присваивает значения пользовательской переменной и системной переменной:

SET @x = 1, SESSION sql_mode = '';

Если вы задаёте несколько системных переменных в одном операторе, используется последний ключевой параметр GLOBAL, PERSIST, PERSIST_ONLY или SESSION в операторе для последующих присваиваний без указания ключа.

Примеры присвоения значений нескольким переменным:

SET GLOBAL sort_buffer_size = 1000000, SESSION sort_buffer_size = 1000000;
SET @@GLOBAL.sort_buffer_size = 1000000, @@LOCAL.sort_buffer_size = 1000000;
SET GLOBAL max_connections = 1000, sort_buffer_size = 1000000;

Модификаторы @@GLOBAL., @@PERSIST., @@PERSIST_ONLY., @@SESSION. и @@ применяются только к непосредственно следующей системной переменной, а не к остальным системным переменным. Этот оператор задаёт глобальное значение sort_buffer_size равным 50000 и сессионное значение равным 1000000:

SET @@GLOBAL.sort_buffer_size = 50000, sort_buffer_size = 1000000;
Ссылок на системные переменные в выражениях

Чтобы обратиться к значению системной переменной в выражениях, используйте один из @@-модификаторов (кроме @@PERSIST. и @@PERSIST_ONLY., которые запрещены в выражениях). Например, вы можете получить значения системных переменных в операторе SELECT следующим образом:

SELECT @@GLOBAL.sql_mode, @@SESSION.sql_mode, @@sql_mode;
Примечание

Ссылка на системную переменную в выражении как @@var_name (с @@ вместо @@GLOBAL. или @@SESSION.) возвращает сессионное значение, если оно существует, и глобальное значение в противном случае. Это отличается от SET @@var_name = expr, которое всегда ссылается на сессионное значение.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/set-variable.html

Spec-Zone.ru

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