Spec-Zone .ru
спецификации, руководства, описания, API
|
Таблица 12.18. Информационные Функции
Имя | Описание |
---|---|
BENCHMARK()
|
Неоднократно выполняйте выражение |
CHARSET()
|
Возвратите набор символов параметра |
COERCIBILITY()
|
Возвратите сопоставление coercibility значение строкового параметра |
COLLATION()
|
Возвратите сопоставление строкового параметра |
CONNECTION_ID()
|
Возвратите ID соединения (ID потока) для соединения |
CURRENT_USER() ,
CURRENT_USER |
Аутентифицируемое имя пользователя и имя хоста |
DATABASE()
|
Возвратите значение по умолчанию (ток) имя базы данных |
FOUND_ROWS()
|
Для ИЗБРАННОГО с ПРЕДЕЛЬНЫМ пунктом число строк, которые были бы возвращены, не было там никаким ПРЕДЕЛЬНЫМ пунктом |
LAST_INSERT_ID()
|
Значение СТОЛБЦА АВТОПРИРАЩЕНИЯ для последней ВСТАВКИ |
ROW_COUNT()
|
Число строк обновляется |
SCHEMA() |
Синоним для БАЗЫ ДАННЫХ () |
SESSION_USER()
|
Синоним для ПОЛЬЗОВАТЕЛЯ () |
SYSTEM_USER()
|
Синоним для ПОЛЬЗОВАТЕЛЯ () |
USER() |
Имя пользователя и имя хоста обеспечили клиентом |
VERSION()
|
Возвращает строку, которая указывает на версию сервера MySQL |
BENCHMARK()
функция выполняет выражение expr
неоднократно count
времена. Это может привыкнуть ко времени, как
быстро MySQL обрабатывает выражение. Значение результата всегда 0
.
Намеченное использование изнутри mysql клиента, который сообщает о временах
выполнения запроса:
mysql> SELECT
BENCHMARK(1000000,ENCODE('hello','goodbye'));
+----------------------------------------------+| BENCHMARK(1000000,ENCODE('hello','goodbye')) |+----------------------------------------------+| 0 |+----------------------------------------------+1 row in set (4.74 sec)
Время, о котором сообщают, является прошедшим временем на клиентском конце, не процессорное время на
конце сервера. Желательно выполниться BENCHMARK()
несколько раз, и интерпретировать результат
относительно того, как в большой степени загруженный машина сервера.
BENCHMARK()
предназначается для того, чтобы определить эксплуатационные качества времени выполнения скалярных
выражений, у которых есть некоторые существенные импликации для способа, которым Вы используете их и
интерпретируете результаты:
Только скалярные выражения могут использоваться. Хотя выражение может
быть подзапросом, оно должно возвратить единственный столбец и самое большее единственную
строку. Например, BENCHMARK(10, (SELECT * FROM t))
перестанет работать если
таблица t
имеет больше чем один столбец или больше чем одна
строка.
Выполнение a SELECT
оператор expr
N
времена отличаются от выполнения SELECT BENCHMARK(
с точки зрения количества включенных
издержек. У этих двух есть совсем другие профили выполнения, и недопустимо ожидать, что они
займут то же самое количество времени. Прежний включает синтаксический анализатор,
оптимизатор, табличную блокировку, и оценку времени выполнения N
, expr
)N
времена каждый. Последний включает только
оценку времени выполнения N
времена, и все другие
компоненты только однажды. Структуры памяти, уже выделенные, снова используются, и
оптимизация времени выполнения, такая как локальное кэширование результатов, уже оцененных
для агрегатных функций, может изменить результаты. Использование BENCHMARK()
таким образом определяет эксплуатационные
качества компонента времени выполнения, давая больше веса тому компоненту и удаляя "шум", представленный
сетью, синтаксическим анализатором, оптимизатором, и т.д.
Возвращает набор символов строкового параметра.
mysql>SELECT CHARSET('abc');
-> 'latin1'mysql>SELECT CHARSET(CONVERT('abc' USING utf8));
-> 'utf8'mysql>SELECT CHARSET(USER());
-> 'utf8'
Возвращает сопоставление coercibility значение строкового параметра.
mysql>SELECT COERCIBILITY('abc' COLLATE latin1_swedish_ci);
-> 0mysql>SELECT COERCIBILITY(USER());
-> 3mysql>SELECT COERCIBILITY('abc');
-> 4
Возвращаемым значениям показали значения в следующей таблице. У нижних значений есть более высокий приоритет.
Coercibility | Значение | Пример |
---|---|---|
0 |
Явное сопоставление | Значение с COLLATE пункт |
1 |
Никакое сопоставление | Связь строк с различными сопоставлениями |
2 |
Неявное сопоставление | Значение столбца, сохраненный стандартный параметр или локальная переменная |
3 |
Постоянная система | USER()
возвращаемое значение
|
4 |
Принудительный | Литеральная строка |
5 |
Игнорируемый | NULL или выражение, полученное изNULL |
Возвращает сопоставление строкового параметра.
mysql>SELECT COLLATION('abc');
-> 'latin1_swedish_ci'mysql>SELECT COLLATION(_utf8'abc');
-> 'utf8_general_ci'
Возвращает ID соединения (ID потока) для соединения. У каждого соединения есть ID, который уникален среди группы в настоящий момент соединенных клиентов.
mysql> SELECT
CONNECTION_ID();
-> 23786
Возвращает комбинацию имени пользователя и имени хоста для учетной записи MySQL что сервер,
используемый, чтобы аутентифицировать текущий клиент. Эта учетная запись определяет Ваши права
доступа. Возвращаемое значение является строкой в utf8
набор символов.
Значение CURRENT_USER()
может отличаться от значения USER()
.
mysql>SELECT USER();
-> 'davida@localhost'mysql>SELECT * FROM mysql.user;
ERROR 1044: Access denied for user ''@'localhost' todatabase 'mysql'mysql>SELECT CURRENT_USER();
-> '@localhost'
Пример иллюстрирует что хотя клиент, определенный имя пользователя davida
(как обозначено значением USER()
функция), сервер, аутентифицируемый клиент, использующий
анонимную учетную запись пользователя (как замечено пустой частью имени пользователя CURRENT_USER()
значение). Одним путем это могло бы произойти, то,
что нет никакой учетной записи, перечисленной в таблицах предоставления для davida
.
В пределах сохраненной программы или представления, CURRENT_USER()
возвращает учетную запись за пользователя, который
определил объект (как дано DEFINER
значение) если не определено с
помощью SQL SECURITY INVOKER
характеристика. В последнем случае, CURRENT_USER()
возвращает invoker объекта.
У триггеров и событий нет никакой опции, чтобы определить SQL SECURITY
характеристика, таким образом, для этих объектов, CURRENT_USER()
возвращает учетную запись за пользователя, который
определил объект. Чтобы возвратить invoker, использовать USER()
или SESSION_USER()
.
Следующие операторы поддерживают использование CURRENT_USER()
функционируйте, чтобы взять место имени (и, возможно,
узел к) пользователь, на которого влияют, или устройство определения; в таких случаях, CURRENT_USER()
расширяется где и как необходимый:
Для получения информации об импликациях, что это расширение CURRENT_USER()
имеет для репликации в различных выпусках MySQL 5.7,
см. Раздел 16.4.1.7, "Репликация CURRENT_USER()
".
Возвращает значение по умолчанию (ток) имя базы данных как строка в utf8
набор символов. Если нет никакой базы данных значения по умолчанию,
DATABASE()
возвраты NULL
. В пределах сохраненной подпрограммы база данных значения
по умолчанию является базой данных, с которой связывается подпрограмма, который является не
обязательно тем же самым как базой данных, которая является значением по умолчанию в контексте
вызова.
mysql> SELECT DATABASE();
-> 'test'
Если нет никакой базы данных значения по умолчанию, DATABASE()
возвраты NULL
.
A SELECT
оператор может включать a LIMIT
пункт, чтобы ограничить число строк
сервер возвращается к клиенту. В некоторых случаях это является требуемым, чтобы знать, сколько
строк оператор возвратился бы без LIMIT
, но не выполняя оператор снова.
Чтобы получить это количество строки, включайте a 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()
возвращает число строк в наборе результатов,
возвращенном тем оператором. Если оператор включает a 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
может
произойти в многократных местах в a 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()
неопределено (например, его значение после a SELECT
оператор, который перестал работать с ошибкой).
FOUND_ROWS()
не тиражируется, достоверно используя основанную на операторе репликацию. Эта функция
автоматически тиражируется, используя построчную репликацию.
LAST_INSERT_ID()
, LAST_INSERT_ID(
expr
)
LAST_INSERT_ID()
(без параметра), возвращает a BIGINT
(64-разрядное) значение, представляющее первое автоматически
сгенерированное значение, успешно вставленное для AUTO_INCREMENT
столбец в результате последний раз выполняемого INSERT
оператор. Значение LAST_INSERT_ID()
остается неизменным, если никакие строки успешно
не вставляются.
Например, после вставки строки, которая генерирует 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()
,
измененное значение замечается операторами, которые следуют за вызовом процедуры.
Для сохраненных функций и триггеров, которые изменяют значение, восстанавливается значение, когда функция или триггерные концы, так после операторов не будут видеть измененное значение.
ID, который был сгенерирован, сохраняется в сервере на основе для каждого
подключения. Это означает, что значение, возвращенное функцией данному клиенту, является
первым AUTO_INCREMENT
значение, сгенерированное для нового оператора,
влияющего AUTO_INCREMENT
столбец тем
клиентом. На это значение не могут влиять другие клиенты, даже если они генерируют
AUTO_INCREMENT
собственные значения. Это поведение гарантирует, что
каждый клиент может получить его собственный ID без беспокойства о действии других клиентов, и без
потребности в блокировках или транзакциях.
Значение LAST_INSERT_ID()
не изменяется, если Вы устанавливаете AUTO_INCREMENT
столбец строки к
не - "волшебное" значение (то есть,
значение, которое не является NULL
и нет 0
).
Если Вы вставляете многократные строки, используя сингл INSERT
оператор, LAST_INSERT_ID()
возвращает значение, сгенерированное для первой вставленной строки только. Причина этого состоит в том, чтобы позволить
воспроизвести легко то же самое INSERT
оператор против некоторого другого сервера.
Например:
mysql>USE test;
Database changedmysql>CREATE TABLE t (
->id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
->name VARCHAR(10) NOT NULL
->);
Query OK, 0 rows affected (0.09 sec)mysql>INSERT INTO t VALUES (NULL, 'Bob');
Query OK, 1 row affected (0.01 sec)mysql>SELECT * FROM t;
+----+------+| id | name |+----+------+| 1 | Bob |+----+------+1 row in set (0.01 sec)mysql>SELECT LAST_INSERT_ID();
+------------------+| LAST_INSERT_ID() |+------------------+| 1 |+------------------+1 row in set (0.00 sec)mysql>INSERT INTO t VALUES
->(NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');
Query OK, 3 rows affected (0.00 sec)Records: 3 Duplicates: 0 Warnings: 0mysql> SELECT * FROM t;+----+------+| id | name |+----+------+| 1 | Bob || 2 | Mary || 3 | Jane || 4 | Lisa |+----+------+4 rows in set (0.01 sec)mysql>SELECT LAST_INSERT_ID();
+------------------+| LAST_INSERT_ID() |+------------------+| 2 |+------------------+1 row in set (0.00 sec)
Хотя второе INSERT
оператор, вставленный три новых строки в t
, ID, сгенерированный для первой из этих строк, был 2
, и именно это значение возвращается LAST_INSERT_ID()
для следующего SELECT
оператор.
Если Вы используете INSERT IGNORE
и строка игнорируется, AUTO_INCREMENT
счетчик не постепенно
увеличивается и LAST_INSERT_ID()
возвраты 0
, который отражает, что никакая строка не была вставлена.
Если expr
дается как параметр LAST_INSERT_ID()
, значение параметра возвращается функцией и
помнится как следующее значение, которое будет возвращено LAST_INSERT_ID()
. Это может использоваться, чтобы моделировать
последовательности:
Составьте таблицу, чтобы содержать последовательность, противостоят и инициализируют это:
mysql>CREATE TABLE sequence (id INT NOT NULL);
mysql>INSERT INTO sequence VALUES (0);
Используйте таблицу, чтобы генерировать порядковые номера как это:
mysql>UPDATE sequence SET id=LAST_INSERT_ID(id+1);
mysql>SELECT LAST_INSERT_ID();
UPDATE
оператор постепенно увеличивает счетчик
последовательности и вызывает следующий звонок LAST_INSERT_ID()
возвратить обновленное значение. SELECT
оператор получает то значение. mysql_insert_id()
C API-функция может также
использоваться, чтобы получить значение. См. Раздел
21.8.7.37,"mysql_insert_id()
".
Можно генерировать последовательности без вызова LAST_INSERT_ID()
, но утилита использования функции, которой состоит в
том этот путь, что Значение идентификатора сохраняется в сервере как последнее автоматически
сгенерированное значение. Это - многопользовательский сейф, потому что многократные клиенты могут
выйти UPDATE
оператор и получает их собственное значение
последовательности с SELECT
оператор (или mysql_insert_id()
),
не влияя или влияясь другими клиентами, которые генерируют их собственные значения
последовательности.
Отметьте это mysql_insert_id()
только обновляется после INSERT
и
UPDATE
операторы, таким образом, невозможно использовать API-функцию C, чтобы получить значение для LAST_INSERT_ID(
после выполнения других
SQL-операторов как expr
)SELECT
или SET
.
В MySQL 5.7, ROW_COUNT()
возвращает значение следующим образом:
Операторы DDL: 0. Это применяется к операторам такой как CREATE TABLE
или
DROP TABLE
.
Операторы DML кроме SELECT
: Число строк, на которые влияют. Это применяется к
операторам такой как UPDATE
, INSERT
, или DELETE
(как прежде), но теперь также к операторам такой
как ALTER TABLE
и LOAD DATA
INFILE
.
SELECT
:-1,
если оператор возвращает набор результатов, или число строк, на которые "влияют", если он не делает.
Например, для SELECT * FROM t1
, ROW_COUNT()
возвраты-1. Для SELECT
* FROM t1 INTO OUTFILE '
, file_name
'ROW_COUNT()
возвращает число строк, записанных файлу.
SIGNAL
операторы: 0.
Для UPDATE
операторы, значение влиявших строк по умолчанию является
числом строк, фактически измененных. Если Вы определяете CLIENT_FOUND_ROWS
флаг к mysql_real_connect()
соединяясь с mysqld, значение влиявших строк является числом
"найденных" строк; то есть, соответствующий WHERE
пункт.
Для REPLACE
операторы, значение влиявших строк 2, если новая строка,
замененная старая строка, потому что в этом случае, одна строка была вставлена после того, как копия
была удалена.
Для INSERT ...
ON DUPLICATE KEY UPDATE
операторы, значение влиявших строк на строку 1, если строка
вставляется как новая строка, 2, если существующая строка обновляется, и 0, если существующая строка
устанавливается в ее текущую стоимость. Если Вы определяете CLIENT_FOUND_ROWS
флаг, значение влиявших строк 1 (не 0), если
существующая строка устанавливается в ее текущую стоимость.
ROW_COUNT()
значение подобно значению от mysql_affected_rows()
C API-функция и количество строки, что mysql клиент выводит на экран следующее
выполнение оператора.
mysql>INSERT INTO t VALUES(1),(2),(3);
Query OK, 3 rows affected (0.00 sec)Records: 3 Duplicates: 0 Warnings: 0mysql>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()
не тиражируется, достоверно используя основанную на операторе репликацию. Эта функция
автоматически тиражируется, используя построчную репликацию.
Эта функция является синонимом для DATABASE()
.
SESSION_USER()
синоним для USER()
.
SYSTEM_USER()
синоним для USER()
.
Возвращает текущее имя пользователя MySQL и имя хоста как строка в utf8
набор символов.
mysql> SELECT USER();
-> 'davida@localhost'
Значение указывает на имя пользователя, которое Вы определили, соединяясь с сервером, и хостом
клиента, от которого Вы соединялись. Значение может отличаться от того из CURRENT_USER()
.
Можно извлечь только часть имени пользователя как это:
mysql> SELECT
SUBSTRING_INDEX(USER(),'@',1);
-> 'davida'
Возвращает строку, которая указывает на версию сервера MySQL. Строка использует utf8
набор символов. У значения мог бы быть суффикс в дополнение к номеру
версии. См. описание version
системная переменная в Разделе
5.1.4, "Системные Переменные Сервера".
Эта функция опасна для основанной на операторе репликации. В MySQL 5.7 регистрируется
предупреждение, если Вы используете эту функцию когда binlog_format
устанавливается в STATEMENT
. (Ошибка #47995)
mysql> SELECT VERSION();
-> '5.7.2-standard'