-
DATABASE()
Возвращает имя текущей базы данных:
mysql> SELECT DATABASE(); -> 'test'
Если в данное время нет активной базы данных, то функция
DATABASE()
возвращает пустую строку. -
USER()
,SYSTEM_USER()
,SESSION_USER()
Возвращает имя текущего активного пользователя MySQL:
mysql> SELECT USER(); -> 'davida@localhost'
В версии MySQL 3.22.11 или более поздней данная функция включает в себя имя хоста клиента, а также имя пользователя. Можно извлечь часть, касающуюся только имени пользователя, приведенным ниже способом (проверяется, включает ли данная величина имя хоста):
mysql> SELECT SUBSTRING_INDEX(USER(),"@",1); -> 'davida'
-
CURRENT_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'
-
PASSWORD(str)
,OLD_PASSWORD(str)
Создает строку "пароля" из простого текста в аргументе
str
. Именно эта функция используется в целях шифрования паролей MySQL для хранения в столбцеPassword
в таблице привилегийuser
:mysql> SELECT PASSWORD('badpwd'); -> '7f84554057dd964b'
Шифрование, которое выполняет функция
PASSWORD()
, необратимо. Способ шифрования пароля, который используется функциейPASSWORD()
, отличается от применяемого для шифрования паролей в Unix.Функция
PASSWORD()
используется в системе аутентификации в сервер MySQL, вам не следует использовать ее для ваших собственных приложений. С этой целью, лучше используйте функцииMD5()
иSHA1()
. -
ENCRYPT(str[,salt])
Шифрует аргумент
str
, используя вызов системной функции кодированияcrypt()
из Unix. Аргументsalt
должен быть строкой из двух символов (в версии MySQL 3.22.16 аргументsalt
может содержать более двух символов):mysql> SELECT ENCRYPT("hello"); -> 'VxuFAJXVARROc'
Если функция
crypt()
в данной операционной системе недоступна, функцияENCRYPT()
всегда возвращаетNULL
. ФункцияENCRYPT()
игнорирует все символы в аргументеstr
, за исключением первых восьми, по крайней мере в некоторых операционных системах - это определяется тем, как реализован системный вызов базовой функцииcrypt()
. -
ENCODE(str,pass_str)
Шифрует
str
, используя аргументpass_str
как пароль. Для расшифровки результата следует использовать функциюDECODE()
. Результат представляет собой двоичную строку той же длины, что иstring
. Для хранения результата в столбце следует использовать столбец типаBLOB
. -
DECODE(crypt_str,pass_str)
Расшифровывает зашифрованную строку
crypt_str
, используя аргументpass_str
как пароль. Аргументcrypt_str
должен быть строкой, возвращаемой функциейENCODE()
. -
MD5(string)
Вычисляет 128-битовую контрольную сумму
MD5
для аргументаstring
. Возвращаемая величина представляет собой 32-разрядное шестнадцатеричное число, которое может быть использовано, например, в качестве хеш-ключа:mysql> SELECT MD5("testing"); -> 'ae2b1fca515949e5d54fb22b8ed95575'
Это "
RSA Data Security, Inc. MD5 Message-Digest Algorithm
". -
SHA1(string)
,SHA(string)
Вычисляет 160-битовую контрольную сумму
SHA1
для аргументаstring
, как описано в RFC 3174 (Secure Hash Algorithm). Возвращаемая величина представляет собой 40-разрядное шестнадцатеричное число илиNULL
(в том случае, если входной аргумент был равенNULL
). Одно из возможных применений для этой функции - в качестве хеш-ключа. Можно ее использовать и как криптографически безопасную функцию для сохранения паролей.mysql> SELECT SHA1("abc"); -> 'a9993e364706816aba3e25717850c26c9cd0d89d'
Функция
SHA1()
была добавлена в версии 4.0.2, и может рассматриваться как более защищенный криптографически эквивалент функцииMD5()
.SHA()
является синонимом для функцииSHA1()
. -
AES_ENCRYPT(string,key_string)
,AES_DECRYPT(string,key_string)
Эти функции позволяют шифровать/дешифровать данные, используя официальный алгоритм AES (Advanced Encryption Standard) (предыдущее название - Rijndael). В нем применяется кодирование с 128-битовым ключом, однако при помощи патча к исходному коду длину ключа можно увеличить до 256 битов. В MySQL выбран 128-битовый ключ, поскольку он работает намного быстрее и обычно обеспечивает вполне достаточную защищенность. Входные аргументы могут быть любой длины. Если один из аргументов равен
NULL
, то результат этой функции также будет иметь значениеNULL
.Так как AES является алгоритмом блочного уровня, то для декодирования используется дополнение строк нечетной длины, так, чтобы длина результирующей строки могла вычисляться как выражение
16*(trunc(длина_строки/16)+1)
.Если
AES_DECRYPT()
обнаруживает некорректные данные или некорректное заполнение строки (имеет в виду padding - прим. пер.), функция вернетNULL
. ОднакоAES_DECRYPT()
вполне может вернуть не-NULL
величину, или, возможно, просто мусор, если входные данных или ключ - некорректны.AES_DECRYPT()
имеет также модификацию, возвращающую величину со значением, не равнымNULL
, даже при неправильном ключе. Функции AES можно использовать для хранения данных в зашифрованном виде путем модификации запросов:INSERT INTO t VALUES (1,AES_ENCRYPT("text","password"));
Можно добиться еще более высокого уровня защищенности за счет исключения передачи ключа через соединение для каждого запроса - для этого ключ на время соединения должен сохраняться в переменной на сервере:
SELECT @password:="my password"; INSERT INTO t VALUES (1,AES_ENCRYPT("text",@password));
Функции
AES_ENCRYPT()
иAES_DECRYPT()
были добавлены в версию 4.0.2 и могут рассматриваться как наиболее криптографически защищенные шифрующие функции, в настоящее время доступные в MySQL. -
DES_ENCRYPT(string_to_encrypt [, (key_number | key_string) ] )
Шифрует строку с заданным ключом, используя алгоритм тройного DES. Следует учитывать, что эта функция работает только тогда, когда конфигурация MySQL поддерживает SSL. See Раздел 4.3.9, «Использование безопасных соединений». Ключ для использования при шифровании выбирается следующим образом:
Аргумент Описание Только один аргумент Используется первый ключ из des-key-file
Номер ключа Используется заданный ключ (0-9) из des-key-file
Строка Для шифрования string_to_encrypt
может использоваться ключ, заданный вkey_string
Функция возвращает двоичную строку, в которой первый символ будет
CHAR(128 | key_number)
. Число128
добавлено для упрощения распознавания зашифрованного ключа. При использовании строкового ключаkey_number
будет равен127
. При ошибке эта функция возвращаетNULL
. Длина строки в результате будет равнаnew_length=org_length + (8-(org_length % 8))+1
. Выражениеdes-key-file
имеет следующий форматt:key_number des_key_string key_number des_key_string
Каждый элемент
key_number
должен быть числом от 0 до 9. Строки в данном файле могут располагаться в произвольном порядке. Выражениеdes_key_string
представляет собой строку, которая будет использована при шифровании сообщения. Между числом и ключом должен быть по крайней мере один пробел. Первый ключ используется по умолчанию, если не задан какой-либо аргумент ключа в функцииDES_ENCRYPT()
. Существует возможность послать MySQL запрос на чтение новых значений ключей из файла ключей при помощи командыFLUSH DES_KEY_FILE
. Эта операция требует наличия привилегииReload_priv
. Одно из преимуществ наличия набора ключей по умолчанию состоит в том, что приложения могут проверять существование зашифрованных величин в столбцах без предоставления конечному пользователю права расшифровки этих величин.mysql> SELECT customer_address FROM customer_table WHERE crypted_credit_card = DES_ENCRYPT("credit_card_number");
-
DES_DECRYPT(string_to_decrypt [, key_string])
Дешифрует строку, зашифрованную с помощью функции
DES_ENCRYPT()
. Следует учитывать, что эта функция работает только тогда, когда конфигурация MySQL поддерживает SSL. See Раздел 4.3.9, «Использование безопасных соединений». Если аргументkey_string
не задан, то функцияDES_DECRYPT()
проверяет первый байт зашифрованной строки для определения номера ключа алгоритма DES, использованного для шифрования исходной строки, Затем читает ключ изdes-key-file
для расшифровки сообщения. Чтобы выполнить это, пользователь должен обладать привилегиейSUPER
. При указании значения аргумента вkey_string
эта строка используется как ключ для дешифровки сообщения. Если строкаstring_to_decrypt
не выглядит как зашифрованная, то MySQL вернет заданную строкуstring_to_decrypt
. При ошибке эта функция возвращаетNULL
. -
LAST_INSERT_ID([expr])
Возвращает последнюю автоматически сгенерированную величину, которая была внесена в столбец
AUTO_INCREMENT
. See Раздел 8.4.3.31, «mysql_insert_id()
».mysql> SELECT LAST_INSERT_ID(); -> 195
Значение последнего сгенерированного
ID
сохраняется на сервере для данного конкретного соединения и не будет изменено другим клиентом. Оно не будет изменено даже при обновлении другого столбцаAUTO_INCREMENT
конкретной величиной (то есть, которая не равнаNULL
и не равна0
). При внесении большого количества строк с помощью одной командыINSERT
функцияLAST_INSERT_ID()
возвращает значение для первой внесенной строки. Причина этого заключается в том, что можно легко воспроизвести точно такую же командуINSERT
на другом сервере.Если задано значение аргумента
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);
Можно генерировать последовательности без вызова
LAST_INSERT_ID()
: полезность применения данной функции состоит в том, что данное значениеID
поддерживается на сервере как последняя автоматически сгенерированная величина (защищенная от других пользователей), и вы можете извлекать новыйID
так же, как и любое другое нормальное значениеAUTO_INCREMENT
в MySQL. Например, функцияLAST_INSERT_ID()
(без аргумента) возвратит новое значениеID
. Функцию C APImysql_insert_id()
также можно использовать для получения этой величины. Следует учитывать, что, поскольку функцияmysql_insert_id()
обновляется только после командINSERT
иUPDATE
, то нельзя использовать эту функцию C API для извлечения значенияID
дляLAST_INSERT_ID(expr)
после выполнения других команд SQL, таких какSELECT
илиSET
. -
FORMAT(X,D)
Форматирует число
X
в формат вида'#,###,###.##'
с округлением доD
десятичных знаков. ЕслиD
равно0
, результат будет представлен без десятичной точки или дробной части:mysql> SELECT FORMAT(12332.123456, 4); -> '12,332.1235' mysql> SELECT FORMAT(12332.1,4); -> '12,332.1000' mysql> SELECT FORMAT(12332.2,0); -> '12,332'
-
VERSION()
Возвращает строку с номером версии сервера MySQL:
mysql> SELECT VERSION(); -> '3.23.13-log'
Следует учитывать, что если данная версия заканчивается с
-log
, то это означает, что включено ведение журналов. -
CONNECTION_ID()
Возвращает идентификатор (
thread_id
) для данного соединения. Каждое соединение имеет свой собственный уникальный идентификатор:mysql> SELECT CONNECTION_ID(); -> 1
-
GET_LOCK(str,timeout)
Пытается осуществить блокировку по имени, которое заданно в строке
str
, с временем ожидания в секундах, указанном в аргументеtimeout
. Возвращает1
, если блокировка осуществлена успешно,0
- если закончилось время ожидания для данной попытки, илиNULL
, если возникла ошибка (такая как отсутствие свободной памяти или уничтожение потока командойmysqladmin kill
).Блокировка снимается при выполнении команды
RELEASE_LOCK()
, запуске новой командыGET_LOCK()
или при завершении данного потока. Эту функцию можно использовать для осуществления блокировок уровня приложения или для моделирования блокировки записи. Функция блокирует запросы других клиентов на блокировку с тем же именем; клиенты, которые используют согласованные имена блокировок, могут применять эту функцию для выполнения совместного упредительного блокирования:mysql> SELECT GET_LOCK("lock1",10); -> 1 mysql> SELECT IS_FREE_LOCK("lock2"); -> 1 mysql> SELECT GET_LOCK("lock2",10); -> 1 mysql> SELECT RELEASE_LOCK("lock2"); -> 1 mysql> SELECT RELEASE_LOCK("lock1"); -> NULL
Обратите внимание: повторный вызов функции
RELEASE_LOCK()
возвращаетNULL
, поскольку блокировкаlock1
была автоматически выполнена вторым вызовом функцииGET_LOCK()
. -
RELEASE_LOCK(str)
Снимает блокировку, указанную в строке
str
, полученной от функцииGET_LOCK()
. Возвращает1
если блокировка была снята,0
- если такая блокировка уже поставлена в другом соединении (в этом случае блокировка не снимается) иNULL
, если блокировки с указанным именем не существует. Последнее может произойти в случае, когда вызов функцииGET_LOCK()
не привел к успешному результату или данная блокировка уже снята. ФункциюRELEASE_LOCK()
удобно использовать совместно с командойDO
. See Раздел 6.4.10, «Синтаксис оператораDO
». -
IS_FREE_LOCK(str)
Проверяет, свободна ли блокировка по имени
str
(т.е. не установлена). Возвращает1
если блокировка свободна (никто не поставил таковую). Возвращает0
если блокировка установлена иNULL
в случае ошибки (например, при неправильных аргументах). -
BENCHMARK(count,expr)
Функция
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)
Указанное в отчете время представляет собой время, подсчитанное на стороне клиента, а не время, затраченное центральным процессором (CPU time) на сервере. Может оказаться целесообразным выполнить
BENCHMARK()
несколько раз, чтобы выяснить, насколько интенсивно загружен серверный компьютер. -
INET_NTOA(expr)
По заданному числовому адресу сети (4 или 8 байтов) возвращает представление указанного адреса в виде разделенных точками четырех октетов в виде строки:
mysql> SELECT INET_NTOA(3520061480); -> "209.207.224.40"
-
INET_ATON(expr)
По заданному представлению сетевого адреса в виде строки, содержащей разделенные точками четыре октета, функция возвращает целое число, представляющее собой числовое значение данного адреса. Адреса могут быть длиной 4 или 8 байтов:
mysql> SELECT INET_ATON("209.207.224.40"); -> 3520061480
Результирующее число всегда генерируется в соответствии с порядком расположения октетов в сетевом адресе, например вышеприведенное число вычисляется как
209*256^3 + 207*256^2 + 224*256 +40
. -
MASTER_POS_WAIT(log_name, log_pos)
Блокируется, пока подчиненный сервер не достигнет определенной точки положения в журнале репликации головного сервера (т.е. не прочитает и не выполнит все операции до указанной позиции).
Если информация головного сервера не инициализирована, или аргументы неправильны, то функция возвращает
NULL
. Если подчиненный сервер не работает, то функция блокируется и ожидает, пока сервер запустится и дойдет до указанной позиции или пройдет через нее. Если подчиненный сервер уже прошел указанную точку, то функция немедленно возвращает результат.Если timeout (новшество в 4.0.10) указан, то ожидание прекратится по прошествии timeout секунд. Таймаут должен быть больше 0. 0 или негативный таймаут означает тоже самое что и отсутствие таймаута.
Возвращаемая величина представляет собой число событий в журнале, которые функция должна была ``переждать'', пока сервер дойдет до указанной точки,
NULL
в случае ошибки или-1
в случае, если истек таймаут. -
FOUND_ROWS()
Возвращает количество строк, которые возвратила бы последняя команда
SELECT SQL_CALC_FOUND_ROWS ...
при отсутствии ограничения операторомLIMIT
.mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10; mysql> SELECT FOUND_ROWS();
Второй вызов команды
SELECT
возвратит количество строк, которые возвратила бы первая команда SELECT, если бы она была написана без выраженияLIMIT
. Отметим, что, хотя при использовании командыSELECT SQL_CALC_FOUND_ROWS ...
, MySQL должен пересчитать все строки в наборе результатов, этот способ все равно быстрее, чем безLIMIT
, так как не требуется посылать результат клиенту.Функция
SQL_CALC_FOUND_ROWS
появилась в MySQL 4.0.0.