Spec-Zone.ru › MySQL 8.4

14.15 Функции информации

Таблица 14.20 Функции информации

Таблица 14.20 Функции информации
Имя Описание
BENCHMARK() Повторно выполнить выражение
CHARSET() Возвращает кодировку символов аргумента
COERCIBILITY() Возвращает значение принудимости сортировки строкового аргумента
COLLATION() Возвращает сортировку строкового аргумента
CONNECTION_ID() Возвращает идентификатор соединения (идентификатор потока) для соединения
CURRENT_ROLE() Возвращает текущие активные роли
###NON_TRANSLATABLE_6, CURRENT_USER Имя аутентифицированного пользователя и имя хоста
DATABASE() Возвращает имя базы данных по умолчанию (текущей)
FOUND_ROWS() Для SELECT с предложением LIMIT, количество строк, которое было бы возвращено без предложения LIMIT
ICU_VERSION() Версия библиотеки ICU
LAST_INSERT_ID() Значение столбца AUTOINCREMENT для последнего INSERT
ROLES_GRAPHML() Возвращает документ GraphML, представляющий подграфы ролей памяти
ROW_COUNT() Количество обновлённых строк
SCHEMA() Синоним для DATABASE()
SESSION_USER() Синоним для USER()
SYSTEM_USER() Синоним для USER()
USER() Имя пользователя и имя хоста, предоставленные клиентом
VERSION() Возвращает строку, указывающую версию сервера MySQL

  • BENCHMARK(count,expr)

    Функция BENCHMARK() выполняет выражение expr повторно count раз. Её можно использовать для измерения скорости обработки выражения MySQL. Результат — 0, или NULL для неподходящих аргументов, таких как NULL или отрицательное значение параметра повторений.

    Предполагается использование из клиентской программы mysql, которая сообщает время выполнения запросов:

    mysql> SELECT BENCHMARK(1000000,AES_ENCRYPT('hello','goodbye'));
    +---------------------------------------------------+
    | BENCHMARK(1000000,AES_ENCRYPT('hello','goodbye')) |
    +---------------------------------------------------+
    |                                                 0 |
    +---------------------------------------------------+
    1 row in set (4.74 sec)
    

    Указанное время — время, прошедшее на стороне клиента, а не время выполнения на сервере. Рекомендуется несколько раз выполнить BENCHMARK() и интерпретировать результат с учётом загрузки машины сервера.

    BENCHMARK() предназначена для измерения времени выполнения скалярных выражений, что имеет определённые последствия для её использования и интерпретации результатов:

    • Можно использовать только скалярные выражения. Хотя выражение может быть подзапросом, оно должно возвращать один столбец и не более одной строки. Например, BENCHMARK(10, (SELECT * FROM t)) не удастся, если таблица t имеет более одного столбца или более одной строки.

    • Выполнение оператора SELECT expr N раз отличается от выполнения SELECT BENCHMARK(N, expr) с точки зрения затрат на обработку. У них очень разные профили выполнения, и вы не должны ожидать одинакового времени. В первом случае участвуют парсер, оптимизатор, блокировка таблиц и вычисление в реальном времени N раз. Во втором случае участвует только вычисление в реальном времени N раз, а все остальные компоненты только один раз. Переиспользуются уже выделенные структуры памяти, и оптимизации в реальном времени, такие как кэширование результатов уже вычисленных агрегатных функций, могут изменить результаты. Таким образом, BENCHMARK() измеряет производительность компонента реального времени, придавая ему большее значение и устраняя “шум”, вносимый сетью, парсером, оптимизатором и т. д.

  • CHARSET(str)

    Возвращает кодировку символов строкового аргумента или NULL, если аргумент является NULL.

    mysql> SELECT CHARSET('abc');
            -> 'utf8mb3'
    mysql> SELECT CHARSET(CONVERT('abc' USING latin1));
            -> 'latin1'
    mysql> SELECT CHARSET(USER());
            -> 'utf8mb3'
    
  • COERCIBILITY(str)

    Возвращает значение принудимости сортировки строкового аргумента.

    mysql> SELECT COERCIBILITY('abc' COLLATE utf8mb4_swedish_ci);
            -> 0
    mysql> SELECT COERCIBILITY(USER());
            -> 3
    mysql> SELECT COERCIBILITY('abc');
            -> 4
    mysql> SELECT COERCIBILITY(1000);
            -> 5
    

    Значения возврата имеют указанный в таблице смысл. Более низкие значения имеют более высокий приоритет.

    Принудимость Значение Пример
    0 Явная сортировка Значение с клаузой COLLATE
    1 Нет сортировки Конкатенация строк с различными сортировками
    2 Неявная сортировка Значение столбца, параметр хранимой процедуры или локальная переменная
    3 Системная константа Значение возврата USER()
    4 Принудительно преобразуемое Литеральная строка
    5 Числовое Числовое или временное значение
    6 Игнорируемое NULL или выражение, полученное из NULL

    Дополнительную информацию см. в разделе 12.8.4 «Принудительная сортировка в выражениях».

  • COLLATION(str)

    Возвращает сортировку строкового аргумента.

    mysql> SELECT COLLATION('abc');
            -> 'utf8mb4_0900_ai_ci'
    mysql> SELECT COLLATION(_utf8mb4'abc');
            -> 'utf8mb4_0900_ai_ci'
    mysql> SELECT COLLATION(_latin1'abc');
            -> 'latin1_swedish_ci'
    
  • CONNECTION_ID()

    Возвращает идентификатор соединения (идентификатор потока) для соединения. Каждое соединение имеет уникальный ID среди набора подключённых клиентов.

    Значение, возвращаемое CONNECTION_ID(), соответствует типу значения, отображаемому в столбце ID таблицы Информационной схемы PROCESSLIST, столбцу Id вывода SHOW PROCESSLIST и столбцу PROCESSLIST_ID таблицы Performance Schema threads.

    mysql> SELECT CONNECTION_ID();
            -> 23786
    
    Предупреждение

    Изменение значения сессии переменной системы pseudo_thread_id изменяет значение, возвращаемое функцией CONNECTION_ID().

  • CURRENT_ROLE()

    Возвращает utf8mb3 строку, содержащую текущие активные роли для текущей сессии, разделённые запятыми, или NONE, если их нет. Значение отражает значение переменной системы sql_quote_show_create.

    Предположим, что учётная запись имеет следующие роли:

    GRANT 'r1', 'r2' TO 'u1'@'localhost';
    SET DEFAULT ROLE ALL TO 'u1'@'localhost';
    

    В сессиях для u1, начальное значение CURRENT_ROLE() называется ролями по умолчанию учётной записи. Использование SET ROLE изменяет это:

    mysql> SELECT CURRENT_ROLE();
    +-------------------+
    | CURRENT_ROLE()    |
    +-------------------+
    | `r1`@`%`,`r2`@`%` |
    +-------------------+
    mysql> SET ROLE 'r1'; SELECT CURRENT_ROLE();
    +----------------+
    | CURRENT_ROLE() |
    +----------------+
    | `r1`@`%`       |
    +----------------+
    
  • CURRENT_USER, CURRENT_USER()

    Возвращает сочетание имени пользователя и имени хоста для учётной записи MySQL, которую сервер использовал для аутентификации текущего клиента. Эта учётная запись определяет ваши привилегии доступа. Возвращаемое значение — строка в кодировке utf8mb3.

    Значение CURRENT_USER() может отличаться от значения USER().

    mysql> SELECT USER();
            -> 'davida@localhost'
    mysql> SELECT * FROM mysql.user;
    ERROR 1044: Access denied for user ''@'localhost' to
    database 'mysql'
    mysql> SELECT CURRENT_USER();
            -> '@localhost'
    

    Пример демонстрирует, что хотя клиент указал имя пользователя davida (как указано значением функции USER()), сервер выполнил аутентификацию клиента с использованием анонимной учётной записи (как видно из пустой части имени пользователя в значении CURRENT_USER()). Одна из причин такого поведения — отсутствие записи в таблицах предоставления прав для davida.

    Внутри хранимой программы или представления CURRENT_USER() возвращает учётную запись пользователя, который определил объект (как задано его значением DEFINER), если не определена характеристика SQL SECURITY INVOKER. В последнем случае CURRENT_USER() возвращает вызывающего объект.

    Для триггеров и событий нет возможности определить характеристику SQL SECURITY, поэтому для этих объектов CURRENT_USER() возвращает учётную запись пользователя, который определил объект. Для возвращения вызывающего объекта используйте USER() или SESSION_USER().

    Следующие инструкции поддерживают использование функции CURRENT_USER() для замещения имени (и, возможно, хоста) затронутого пользователя или определяющего его; в таких случаях CURRENT_USER() расширяется по мере необходимости:

    • DROP USER

    • RENAME USER

    • GRANT

    • REVOKE

    • CREATE FUNCTION

    • CREATE PROCEDURE

    • CREATE TRIGGER

    • CREATE EVENT

    • CREATE VIEW

    • ALTER EVENT

    • ALTER VIEW

    • SET PASSWORD

    Сведения о последствиях расширения CURRENT_USER() для репликации см. в разделе 19.5.1.8, «Репликация CURRENT_USER()».

    Эту функцию можно использовать в качестве значения по умолчанию для столбца типа VARCHAR или TEXT, как показано в следующем операторе CREATE TABLE:

    CREATE TABLE t (c VARCHAR(288) DEFAULT (CURRENT_USER()));
    
  • DATABASE()

    Возвращает имя базы данных по умолчанию (текущее) в виде строки в кодировке utf8mb3. Если базы данных по умолчанию нет, DATABASE() возвращает NULL. Внутри хранимой процедуры база данных по умолчанию — база данных, к которой относится процедура, что не обязательно совпадает с базой данных по умолчанию в контексте вызова.

    mysql> SELECT DATABASE();
            -> 'test'
    

    Если базы данных по умолчанию нет, DATABASE() возвращает NULL.

  • FOUND_ROWS()

    Примечание

    Модификатор запроса SQL_CALC_FOUND_ROWS и сопровождающая функция FOUND_ROWS() устарели; ожидается, что они будут удалены в будущей версии MySQL. Выполните запрос с помощью LIMIT, а затем второй запрос с COUNT(*) и без LIMIT, чтобы определить, есть ли дополнительные строки. Например, вместо этих запросов:

    SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
    SELECT FOUND_ROWS();
    

    Используйте эти запросы вместо них:

    SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
    SELECT COUNT(*) FROM tbl_name WHERE id > 100;
    

    COUNT(*) может быть оптимизирован по-разному. SQL_CALC_FOUND_ROWS приводит к отключению некоторых оптимизаций.

    Оператор SELECT может включать в себя предложение LIMIT для ограничения количества строк, возвращаемых сервером клиенту. В некоторых случаях желательно знать, сколько строк вернул бы оператор без LIMIT, но без повторного выполнения оператора. Чтобы получить это количество строк, включите опцию SQL_CALC_FOUND_ROWS в оператор SELECT, а затем вызовите FOUND_ROWS() после этого:

    mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
        -> WHERE id > 100 LIMIT 10;
    mysql> SELECT FOUND_ROWS();
    

    Второй SELECT возвращает число, указывающее, сколько строк вернул бы первый SELECT, если бы он был написан без предложения LIMIT.

    В отсутствие опции SQL_CALC_FOUND_ROWS в последнем успешно выполненном операторе SELECT, FOUND_ROWS() возвращает количество строк в наборе результатов, возвращённом этим оператором. Если оператор включает в себя предложение LIMIT, FOUND_ROWS() возвращает количество строк до предела. Например, FOUND_ROWS() возвращает 10 или 60 соответственно, если оператор включает в себя LIMIT 10 или LIMIT 50, 10.

    Количество строк, доступное через FOUND_ROWS(), является временным и не предназначено для использования после оператора, следующего за SELECT SQL_CALC_FOUND_ROWS оператором. Если вам нужно обратиться к значению позже, сохраните его:

    mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ;
    mysql> SET @rows = FOUND_ROWS();
    

    Если вы используете SELECT SQL_CALC_FOUND_ROWS, MySQL должен рассчитать количество строк в полном наборе результатов. Однако это быстрее, чем повторно запускать запрос без LIMIT, так как набор результатов не нужно отправлять клиенту.

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

    Использование SQL_CALC_FOUND_ROWS и FOUND_ROWS() сложнее для операторов UNION, чем для простых операторов SELECT, потому что LIMIT может возникать в нескольких местах в операторе UNION. Он может применяться к отдельным операторам SELECT в операторе UNION, или глобально к результату оператора UNION в целом.

    Цель SQL_CALC_FOUND_ROWS для операторов UNION заключается в том, чтобы возвращать количество строк, которое было бы возвращено без глобального LIMIT. Условия использования SQL_CALC_FOUND_ROWS с операторами UNION следующие:

    • Ключевое слово SQL_CALC_FOUND_ROWS должно присутствовать в первом операторе SELECT оператора UNION.

    • Значение FOUND_ROWS() точное только если используется оператор UNION ALL. Если используется оператор UNION без ALL, происходит удаление дубликатов, и значение FOUND_ROWS() является приблизительным.

    • Если LIMIT отсутствует в операторе UNION, SQL_CALC_FOUND_ROWS игнорируется и возвращает количество строк во временной таблице, созданной для обработки оператора UNION.

    Вне случаев, описанных здесь, поведение FOUND_ROWS() не определено (например, его значение после оператора SELECT, который завершается ошибкой).

    Важно

    FOUND_ROWS() не дублируется надёжно с помощью репликации на основе операторов. Эта функция автоматически дублируется с помощью репликации на основе строк.

  • ICU_VERSION()

    Версия библиотеки International Components for Unicode (ICU), используемой для поддержки операций с регулярными выражениями (см. Раздел 14.8.2, “Регулярные выражения”). Эта функция предназначена в первую очередь для использования в тестовых случаях.

  • LAST_INSERT_ID(), LAST_INSERT_ID(expr)

    Без аргумента, LAST_INSERT_ID() возвращает значение BIGINT UNSIGNED (64-битное), представляющее первое автоматически сгенерированное значение, успешно вставленное в столбец AUTO_INCREMENT в результате последнего выполненного оператора INSERT. Значение LAST_INSERT_ID() остаётся неизменным, если строки не были успешно вставлены.

    С аргументом, LAST_INSERT_ID() возвращает целое беззнаковое число или NULL, если аргумент имеет значение NULL.

    Например, после вставки строки, которая генерирует значение AUTO_INCREMENT, вы можете получить это значение так:

    mysql> SELECT LAST_INSERT_ID();
            -> 195
    

    Выполняемый в данный момент оператор не влияет на значение LAST_INSERT_ID(). Предположим, что вы сгенерировали значение AUTO_INCREMENT одним оператором, а затем обращаетесь к LAST_INSERT_ID() в операторе INSERT с несколькими строками, который вставляет строки в таблицу со своим столбцом AUTO_INCREMENT. Значение LAST_INSERT_ID() остаётся неизменным во втором операторе; его значение для второй и последующих строк не изменяется в результате предыдущих вставок строк. (Следует знать, что если вы смешиваете ссылки на LAST_INSERT_ID() и LAST_INSERT_ID(expr), эффект неопределён.)

    Если предыдущий оператор вернул ошибку, значение LAST_INSERT_ID() не определено. Для транзакционных таблиц, если оператор отменён из-за ошибки, значение LAST_INSERT_ID() остаётся неопределённым. Для ручного ROLLBACK значение LAST_INSERT_ID() не восстанавливается до значения до начала транзакции; оно остаётся таким, каким было в момент ROLLBACK.

    В теле хранимой процедуры (процедуры или функции) или триггера, значение LAST_INSERT_ID() изменяется так же, как и для операторов, выполняемых вне тела таких объектов. Влияние хранимой процедуры или триггера на значение LAST_INSERT_ID(), которое видят следующие операторы, зависит от типа процедуры:

    • Если хранимая процедура выполняет операторы, которые изменяют значение LAST_INSERT_ID(), изменённое значение будет видно операторами, которые следуют за вызовом процедуры.

    • Для хранимых функций и триггеров, которые изменяют значение, оно восстанавливается при завершении функции или триггера, поэтому операторы, следующие за ними, не видят изменённого значения.

    Сгенерированный идентификатор сохраняется на сервере на основе соединения. Это означает, что значение, возвращаемое функцией данному клиенту, является первым значением AUTO_INCREMENT, сгенерированным для последнего оператора, влияющего на столбец AUTO_INCREMENT этим клиентом. Это значение не может быть изменено другими клиентами, даже если они генерируют значения AUTO_INCREMENT. Это поведение гарантирует, что каждый клиент может получить свой идентификатор, не беспокоясь о деятельности других клиентов, и без необходимости блокировок или транзакций.

    Значение LAST_INSERT_ID() не изменяется, если вы устанавливаете столбец AUTO_INCREMENT строки на не-“магическое” значение (т. е. значение, которое не является NULL и не 0).

    Важно

    Если вы вставляете несколько строк с помощью одного оператора INSERT, LAST_INSERT_ID() возвращает только значение, сгенерированное для первой вставленной строки. Причина в том, чтобы сделать возможным лёгкое воспроизведение одного и того же оператора INSERT на другом сервере.

    Например:

    mysql> USE test;
    
    mysql> CREATE TABLE t (
           id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
           name VARCHAR(10) NOT NULL
           );
    
    mysql> INSERT INTO t VALUES (NULL, 'Bob');
    
    mysql> SELECT * FROM t;
    +----+------+
    | id | name |
    +----+------+
    |  1 | Bob  |
    +----+------+
    
    mysql> SELECT LAST_INSERT_ID();
    +------------------+
    | LAST_INSERT_ID() |
    +------------------+
    |                1 |
    +------------------+
    
    mysql> INSERT INTO t VALUES
           (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');
    
    mysql> SELECT * FROM t;
    +----+------+
    | id | name |
    +----+------+
    |  1 | Bob  |
    |  2 | Mary |
    |  3 | Jane |
    |  4 | Lisa |
    +----+------+
    
    mysql> SELECT LAST_INSERT_ID();
    +------------------+
    | LAST_INSERT_ID() |
    +------------------+
    |                2 |
    +------------------+
    

    Хотя второй оператор INSERT вставил три новые строки в t, сгенерированный идентификатор для первой из этих строк был 2, и именно это значение возвращает LAST_INSERT_ID() для последующего оператора SELECT.

    Если вы используете INSERT IGNORE, и строка игнорируется, LAST_INSERT_ID() остаётся неизменным (или возвращает 0, если соединение ещё не выполнило успешной INSERT). Для не транзакционных таблиц счётчик AUTO_INCREMENT не увеличивается. Для таблиц InnoDB счётчик AUTO_INCREMENT увеличивается, если innodb_autoinc_lock_mode установлен в 1 или 2, как показано в следующем примере:

    mysql> USE test;
    
    mysql> SELECT @@innodb_autoinc_lock_mode;
    +----------------------------+
    | @@innodb_autoinc_lock_mode |
    +----------------------------+
    |                          1 |
    +----------------------------+
    
    mysql> CREATE TABLE `t` (
           `id` INT(11) NOT NULL AUTO_INCREMENT,
           `val` INT(11) DEFAULT NULL,
           PRIMARY KEY (`id`),
           UNIQUE KEY `i1` (`val`)
           ) ENGINE=InnoDB;
    
    # Insert two rows
    
    mysql> INSERT INTO t (val) VALUES (1),(2);
    
    # With auto_increment_offset=1, the inserted rows
    # result in an AUTO_INCREMENT value of 3
    
    mysql> SHOW CREATE TABLE t\G
    *************************** 1. row ***************************
           Table: t
    Create Table: CREATE TABLE `t` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `val` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `i1` (`val`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    
    # LAST_INSERT_ID() returns the first automatically generated
    # value that is successfully inserted for the AUTO_INCREMENT column
    
    mysql> SELECT LAST_INSERT_ID();
    +------------------+
    | LAST_INSERT_ID() |
    +------------------+
    |                1 |
    +------------------+
    
    # The attempted insertion of duplicate rows fail but errors are ignored
    
    mysql> INSERT IGNORE INTO t (val) VALUES (1),(2);
    Query OK, 0 rows affected (0.00 sec)
    Records: 2  Duplicates: 2  Warnings: 0
    
    # With innodb_autoinc_lock_mode=1, the AUTO_INCREMENT counter
    # is incremented for the ignored rows
    
    mysql> SHOW CREATE TABLE t\G
    *************************** 1. row ***************************
           Table: t
    Create Table: CREATE TABLE `t` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `val` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `i1` (`val`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    
    # The LAST_INSERT_ID is unchanged because the previous insert was unsuccessful
    
    mysql> SELECT LAST_INSERT_ID();
    +------------------+
    | LAST_INSERT_ID() |
    +------------------+
    |                1 |
    +------------------+
    

    Дополнительную информацию см. в Разделе 17.6.1.6, «Обработка AUTO_INCREMENT в InnoDB».

    Если expr задано в качестве аргумента для LAST_INSERT_ID(), функция возвращает значение аргумента и запоминает его как следующее значение, которое вернёт LAST_INSERT_ID(). Это можно использовать для симуляции последовательностей:

    1. Создайте таблицу для хранения счётчика последовательности и инициализируйте её:

      mysql> CREATE TABLE sequence (id INT NOT NULL);
      mysql> INSERT INTO sequence VALUES (0);
      
    2. Используйте таблицу для генерации номеров последовательности так:

      mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);
      mysql> SELECT LAST_INSERT_ID();
      

      Оператор UPDATE увеличивает счётчик последовательности и вызывает следующее обращение к LAST_INSERT_ID(), чтобы вернуть обновлённое значение. Оператор SELECT извлекает это значение. Функцию C API также можно использовать для получения значения. См. .

    Вы можете генерировать последовательности без вызова LAST_INSERT_ID(), но полезность использования функции таким образом заключается в том, что значение идентификатора поддерживается на сервере как последнее автоматически сгенерированное значение. Это безопасно для множественных пользователей, поскольку несколько клиентов могут выполнить оператор UPDATE и получить собственное значение последовательности с помощью оператора SELECT (или ), не влияя и не подвергаясь влиянию других клиентов, генерирующих собственные значения последовательности.

    Обратите внимание, что обновляется только после операторов INSERT и UPDATE, поэтому вы не можете использовать функцию C API для получения значения для LAST_INSERT_ID(expr) после выполнения других SQL операторов, таких как SELECT или SET.

  • ROLES_GRAPHML()

    Возвращает строку utf8mb3, содержащую документ GraphML, представляющий подграфы ролей памяти. Для просмотра содержимого в элементе <graphml> необходимо право ROLE_ADMIN (или устаревшее право SUPER). В противном случае результат покажет только пустой элемент:

    mysql> SELECT ROLES_GRAPHML();
    +---------------------------------------------------+
    | ROLES_GRAPHML()                                   |
    +---------------------------------------------------+
    | <?xml version="1.0" encoding="UTF-8"?><graphml /> |
    +---------------------------------------------------+
    
  • ROW_COUNT()

    ROW_COUNT() возвращает значение следующим образом:

    • Операторы DDL: 0. Это относится к операторам, таким как CREATE TABLE или DROP TABLE.

    • Операторы DML, кроме SELECT: Количество затронутых строк. Это относится к операторам, таким как UPDATE, INSERT или DELETE (как и прежде), но теперь также к операторам, таким как ALTER TABLE и LOAD DATA.

    • SELECT: -1, если оператор возвращает результат набора, или количество строк “затронутых”, если он не возвращает. Например, для SELECT * FROM t1, ROW_COUNT() возвращает -1. Для SELECT * FROM t1 INTO OUTFILE 'file_name', ROW_COUNT() возвращает количество строк, записанных в файл.

    • Операторы SIGNAL: 0.

    Для операторов UPDATE значение затронутых строк по умолчанию равно количеству фактически изменённых строк. Если вы укажете флаг CLIENT_FOUND_ROWS при подключении к mysqld, значение затронутых строк равно количеству строк “найденных”, то есть, соответствующих условию WHERE.

    Для операторов REPLACE значение затронутых строк равно 2, если новая строка заменила старую строку, потому что в этом случае одна строка была вставлена после удаления дубликата.

    Для операторов INSERT ... ON DUPLICATE KEY UPDATE значение затронутых строк на строку равно 1, если строка вставляется как новая строка, 2, если существующая строка обновляется, и 0, если существующая строка устанавливается на свои текущие значения. Если вы укажете флаг CLIENT_FOUND_ROWS, значение затронутых строк равно 1 (а не 0), если существующая строка устанавливается на свои текущие значения.

    Значение ROW_COUNT() аналогично значению из функции C API и количеству строк, отображаемому клиентом mysql после выполнения оператора.

    mysql> INSERT INTO t VALUES(1),(2),(3);
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> SELECT ROW_COUNT();
    +-------------+
    | ROW_COUNT() |
    +-------------+
    |           3 |
    +-------------+
    1 row in set (0.00 sec)
    
    mysql> DELETE FROM t WHERE i IN(1,2);
    Query OK, 2 rows affected (0.00 sec)
    
    mysql> SELECT ROW_COUNT();
    +-------------+
    | ROW_COUNT() |
    +-------------+
    |           2 |
    +-------------+
    1 row in set (0.00 sec)
    
    Важно

    ROW_COUNT() не реплицируется надёжно с помощью репликации на основе операторов. Эта функция автоматически реплицируется с помощью репликации на основе строк.

  • SCHEMA()

    Эта функция является синонимом для DATABASE().

  • SESSION_USER()

    SESSION_USER() является синонимом для USER().

    Как и USER(), эта функция может использоваться в качестве значения по умолчанию для столбца типа VARCHAR или TEXT, как показано в следующем операторе CREATE TABLE:

    CREATE TABLE t (c VARCHAR(288) DEFAULT (SESSION_USER()));
    
  • SYSTEM_USER()

    SYSTEM_USER() является синонимом для USER().

    Примечание

    Функция SYSTEM_USER() отличается от привилегии SYSTEM_USER. Первая возвращает текущее имя учётной записи MySQL. Вторая различает категории учётных записей системного пользователя и обычного пользователя (см. Раздел 8.2.11, “Категории учётных записей”).

    Как и USER(), эта функция может использоваться в качестве значения по умолчанию для столбца типа VARCHAR или TEXT, как показано в следующем операторе CREATE TABLE:

    CREATE TABLE t (c VARCHAR(288) DEFAULT (SYSTEM_USER()));
    
  • USER()

    Возвращает текущее имя пользователя и имя хоста MySQL в виде строки в наборе символов utf8mb3.

    mysql> SELECT USER();
            -> 'davida@localhost'
    

    Значение указывает имя пользователя, которое вы указали при подключении к серверу, и хост клиента, с которого вы подключились. Значение может отличаться от значения CURRENT_USER().

    Эта функция может использоваться в качестве значения по умолчанию для столбца типа VARCHAR или TEXT, как показано в следующем операторе CREATE TABLE:

    CREATE TABLE t (c VARCHAR(288) DEFAULT (USER()));
    
  • VERSION()

    Возвращает строку, которая указывает версию сервера MySQL. Строка использует набор символов utf8mb3. Значение может иметь суффикс в дополнение к номеру версии. См. описание системной переменной version в Разделе 7.1.8, “Системные переменные сервера”.

    Эта функция небезопасна для репликации на основе операторов. Если вы используете эту функцию, когда binlog_format установлено в STATEMENT, будет записано предупреждение.

    mysql> SELECT VERSION();
            -> '8.4.4-standard'
    

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

Spec-Zone.ru

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