Spec-Zone.ru › MySQL 9.2

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

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

Таблица 14.20 Функции информации
Имя Описание
BENCHMARK() Повторяющее выполнение выражения
CHARSET() Возвращает кодировку символов аргумента
COERCIBILITY() Возвращает значение принуждения сортировки для строкового аргумента
COLLATION() Возвращает сортировку строкового аргумента
CONNECTION_ID() Возвращает идентификатор подключения (идентификатор потока) для подключения
CURRENT_ROLE() Возвращает текущие активные роли
CURRENT_USER(), 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)
    

    Указанное время — это время ожидания на стороне клиента, а не время CPU на стороне сервера. Рекомендуется выполнять 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 таблицы схемы производительности 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();
            -> '9.2.0-standard'
    

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

Spec-Zone.ru

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