Buy this Reference Manual in softcover from Barnes & Noble!
DATABASE()
mysql> SELECT DATABASE(); -> 'test'Если в данное время нет активной базы данных, то функция
DATABASE()
возвращает пустую строку.
USER()
SYSTEM_USER()
SESSION_USER()
mysql> SELECT USER(); -> 'davida@localhost'В версии MySQL 3.22.11 или более поздней данная функция включает в себя имя хоста клиента, а также имя пользователя. Можно извлечь часть, касающуюся только имени пользователя, приведенным ниже способом (проверяется, включает ли данная величина имя хоста):
mysql> SELECT SUBSTRING_INDEX(USER(),"@",1); -> 'davida'
PASSWORD(str)
str
. Именно эта функция используется в целях шифрования паролей MySQL для хранения в столбце Password
в таблице привилегий user
:
mysql> SELECT PASSWORD('badpwd'); -> '7f84554057dd964b'Шифрование, которое выполняет функция
PASSWORD()
, необратимо. Способ шифрования пароля, который используется функцией PASSWORD()
, отличается от применяемого для шифрования паролей в Unix. Не следует ожидать, что, если пароли одинаковы для Unix и для MySQL, то функция PASSWORD()
даст в результате то же зашифрованное значение, которое хранится в файле паролей Unix. См. описание функции ENCRYPT()
.
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)
MD5
для аргумента string
. Возвращаемая величина представляет собой 32-разрядное шестнадцатеричное число, которое может быть использовано, например, в качестве хеш-ключа:
mysql> SELECT MD5("testing"); -> 'ae2b1fca515949e5d54fb22b8ed95575'Это "
RSA Data Security, Inc. MD5 Message-Digest Algorithm
".
SHA1(string)
SHA(string)
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)
NULL
, то результат этой функции также будет иметь значение NULL
. Так как AES является алгоритмом блочного уровня, то для декодирования используется дополнение строк нечетной длины, так, чтобы длина результирующей строки могла вычисляться как выражение 16*(trunc(длина_строки/16)+1)
. Если строка имеет некорректную длину или содержит неверные данные для этого ключа, то функция 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-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 section 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 section 8.4.3.126 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 API mysql_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> 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 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 section 6.4.10 Синтаксис оператора DO
.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)
mysql> SELECT INET_NTOA(3520061480); -> "209.207.224.40"
INET_ATON(expr)
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
. Если подчиненный сервер не работает, то функция блокируется и ожидает, пока сервер запустится и дойдет до указанной позиции или пройдет через нее. Если подчиненный сервер уже прошел указанную точку, то функция немедленно возвращает результат. Возвращаемая величина представляет собой число событий в журнале, которые функция должна была ``переждать'', пока сервер дойдет до указанной точки, или NULL
в случае ошибки. Функция полезна для контроля совместной работы головного и подчиненного серверов, но первоначально была написана с целью упрощения тестирования процесса репликации.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
, так как не требуется посылать результат клиенту.
Posted by Jim Martin on Tuesday June 11 2002, @10:10am | [Delete] [Edit] |
Experimentation has shown that if the client that
institutes a lock via GET_LOCK goes away (crashes,
exits, etc), the lock goes away as well. It's
pretty obvious, and definitely what you would
expect to happen, but this behavior probably
should be documented.
Posted by on Wednesday December 18 2002, @5:29pm | [Delete] [Edit] |
FORMAT(X,D) returns a formatted number
of type VARCHAR, NOT whatever
number type X was previously.
Posted by on Tuesday October 15 2002, @2:32pm | [Delete] [Edit] |
GET_LOCK also seems to be global across databases
in one instance of MySQL.
Posted by on Wednesday November 20 2002, @2:07pm | [Delete] [Edit] |
In the documentation for ENCODE:
ENCODE(str,pass_str)
Encrypt str using pass_str as the password. To
decrypt the result, use DECODE(). The results is a
binary string of the same length as string. If you
want to save it in a column, use a BLOB column type.
its says that you shoudl use a BLOB column type.
But it doesn't say why. I think the reason for
this is because other string data types don't
preserve spaces. And the encrypted string may have
trailing spaces that are significant, correct?
Otherwise somebody might try it with a VARCHAR()
for instance and it works and they wouldn't know
that its actually going to fail every once in a while.
Posted by on Monday January 13 2003, @7:23pm | [Delete] [Edit] |
As far as I can tell, you cannot use another function inside of the DECODE function (which happens to be something I wish it would do since the encoding process I chose to use in one case was based on variable information that is only retrievable via a function)
Posted by alex on Thursday February 20 2003, @3:08pm | [Delete] [Edit] |
In response to Mike Wexler's comment:
The field needs a BLOB column because ENCODE() returns BINARY data, and a BLOB column is required to store binary data.
Posted by alex on Thursday February 20 2003, @3:10pm | [Delete] [Edit] |
In response to Chris K's commment:
SELECT DECODE(ENCODE('My wonderful hat', 'abc'), 'abc')
works fine on 3.23.49-nt
Add your own comment.