Примеры NORMALIZE_DECFLOAT
DECFLOAT
NORMALIZE_DECFLOAT(12.00) -- возвращает 12
NORMALIZE_DECFLOAT(120) -- возвращает 1.2E+2
Функции для работы с контекстными переменными
Функции для работы со строками
Функции для работы с датой и временем
Функции для работы с типом BLOB
Функции для работы с типом DECFLOAT
NORMALIZE_DECFLOAT
DECFLOAT
NORMALIZE_DECFLOAT(12.00) -- возвращает 12
NORMALIZE_DECFLOAT(120) -- возвращает 1.2E+2
QUANTIZE()
DSQL, PSQL
QUANTIZE (decfloat_value, exp_value)
Параметр | Описание |
---|---|
decfloat_value |
Значение или выражение типа |
exp_value |
Значение или выражение для использования в качестве показателя степени;должно иметь тип |
DECFLOAT
Функция QUANTIZE
возвращает значение первого аргумента масштабированным с использованием второго значения в качестве шаблона.Другими словами функция QUANTIZE
возвращает значение DECFLOAT
, равное по значению (за исключением любого округления) и знаку decfloat_value, а также экспоненте, равной по значению экспоненте exp_value.Функцию QUANTIZE
можно использовать для реализации округления с точностью до нужного знака, например, округление до ближайшего цента с использованием установленного режима округления DECFLOAT
.
Тип возвращаемого значения — DECFLOAT(16)
, если оба аргумента — DECFLOAT(16)
, в противном случае тип результата — DECFLOAT(34)
.
Note
|
Целевой показатель — это показатель, используемый в формате хранения |
Если показатель decfloat_value больше, чем показатель exp_value, коэффициент decfloat_value умножается на степень десяти, и его показатель уменьшается, если показатель меньше, то его коэффициент округляется с использованием текущего режима округления decfloat, и его показатель увеличивается.
Когда невозможно достичь целевого показателя экспоненты, поскольку коэффициент превысит целевую точность (16 или 34 десятичных знака), то либо возникает ошибка “Decfloat float invalid operation”, либо возвращается NaN
(в зависимости от текущего конфигурация decfloat traps).
Ограничений на exp_value практически нет.Однако почти во всех случаях использования NaN
/sNaN
/Infinity
будет вызывать исключение(если это не разрешено текущей конфигурацией decfloat traps)
Если одно из значений NULL
, то результатом функции будет NULL
и т.д.
QUANTIZE
select v, pic, quantize(v, pic) from examples;
V PIC QUANTIZE ======================= ===================== ================== 3.16 0.001 3.160 3.16 0.01 3.16 3.16 0.1 3.2 3.16 1 3 3.16 1E+1 0E+1 -0.1 1 -0 0 1E+5 0E+5 316 0.1 316.0 316 1 316 316 1E+1 3.2E+2 316 1E+2 3E+2
TOTALORDER()
DSQL, PSQL
TOTALORDER (decfloat1, decfloat2)
Параметр | Описание |
---|---|
decfloat1, decfloat2 |
Значение или выражение типа |
SMALLINT
Функция TOTALORDER
сравнивает два значения типа DECFLOAT
, включая специальные значения.Сравнение является точным. Замыкающие нули учитываются при сравнении.
Функция возвращает:
-1 — если первое значение меньше второго;
0 — если значения равны;
1 — если первое значение больше второго.
Сравнений значений DEFLOAT
происходит в следующем порядке:
-nan < -snan < -inf < -0.1 < -0.10 < -0 < 0 < 0.10 < 0.1 < inf < snan < nan
См. также:[fblangref-scalarfuncs-comparedecfloat]
В Firebird 4.0 поддерживается только подмножество симметричных алгоритмов шифрования (как блочных так и потоковых), так и RSA.
CRYPT_HASH()
DSQL, PSQL
CRYPT_HASH (value USING <algorithm>) <algorithm> ::= { MD5 | SHA1 | SHA256 | SHA512 | SHA3_224 | SHA3_256 | SHA3_384 | SHA3_512 }
Параметр | Описание |
---|---|
value |
Выражение любого типа. Не строковые и не бинарные типы приводятся к строке. |
algorithm |
Алгоритм хеширования. |
VARBINARY
Функция CRYPT_HASH
возвращает криптографический хэш входной строки, используя указанный алгоритм.Эта функция полностью поддерживает текстовые BLOB
любой длины и с любым набором символов.Предложение USING
позволяет указать алгоритм по которому вычисляет хэш.
Note
|
Алгоритмы |
CRYPT_HASH
CRYPT_HASH
SELECT CRYPT_HASH(x USING SHA256) FROM MyTable;
-- результат типа VARBINARY
DECRYPT()
DSQL, PSQL
DECRYPT (encrypted_input [USING <algorithm>] [MODE <mode>] KEY key [IV iv] [<ctr_type>] [CTR_LENGTH ctr_length] [COUNTER initial_counter] ) <algorithm> ::= <block_cipher> | <stream_cipher> <block_cipher> ::= AES | ANUBIS | BLOWFISH | KHAZAD | RC5 | RC6 | SAFER+ | TWOFISH | XTEA <stream_cipher> ::= CHACHA20 | RC4 | SOBER128 <mode> ::= CBC | CFB | CTR | ECB | OFB <ctr_type> ::= CTR_BIG_ENDIAN | CTR_LITTLE_ENDIAN
Параметр | Описание |
---|---|
encrypted_input |
Зашифрованный BLOB или (двоичная) строка |
algorithm |
Алгоритм шифрования.Поддерживаются как блочные, так и потоковые алгоритмы. |
mode |
Режим шифрования.Обязателен для блочных алгоритмов шифрования. |
key |
Ключ шифрования. |
iv |
Вектор инициализации (IV). Должен быть указан для всех блочных алгоритмов шифрования за исключением |
ctr_type |
Порядок байтов счётчика.Может быть указан только в режиме |
ctr_length |
Длина счётчика в байтах.Может быть указана только в режиме |
initial_counter |
Начальное значение счётчика.Может быть указана только для алгоритма |
BLOB
или VARBINARY
.
Функция DECRYPT
дешифрует данные с использованием симметричного шифра.Размеры строк передаваемых в эту функцию должны соответствовать требованиям выбранного алгоритма и режима.
DECRYPT
select decrypt(x'0154090759DF' using sober128 key 'AbcdAbcdAbcdAbcd'
iv '01234567')
from rdb$database;
select decrypt(secret_field using aes mode ofb key '0123456701234567'
iv init_vector)
from secure_table;
ENCRYPT()
DSQL, PSQL
ENCRYPT (input [USING <algorithm>] [MODE <mode>] KEY key [IV iv] [<ctr_type>] [CTR_LENGTH ctr_length] [COUNTER initial_counter] ) <algorithm> ::= <block_cipher> | <stream_cipher> <block_cipher> ::= AES | ANUBIS | BLOWFISH | KHAZAD | RC5 | RC6 | SAFER+ | TWOFISH | XTEA <stream_cipher> ::= CHACHA20 | RC4 | SOBER128 <mode> ::= CBC | CFB | CTR | ECB | OFB <ctr_type> ::= CTR_BIG_ENDIAN | CTR_LITTLE_ENDIAN
Параметр | Описание |
---|---|
input |
Выражение строкового типа или |
algorithm |
Алгоритм шифрования.Поддерживаются как блочные, так и потоковые алгоритмы. |
mode |
Режим шифрования.Обязателен для блочных алгоритмов шифрования. |
key |
Ключ шифрования. |
iv |
Вектор инициализации (IV). Должен быть указан для всех блочных алгоритмов шифрования за исключением |
ctr_type |
Порядок байтов счётчика.Может быть указан только в режиме |
ctr_length |
Длина счётчика в байтах.Может быть указана только в режиме |
initial_counter |
Начальное значение счётчика.Может быть указана только для алгоритма |
BLOB
или VARBINARY
Функция ENCRYPT
шифрует данные с использованием симметричного шифра.
Note
|
|
Особенности различных алгоритмов и режимов выходят за рамки данного справочника по языку.
Алгоритм | Размер ключа (байт) | Размер блока (байт) | Примечание |
---|---|---|---|
Блочное шифрование |
|||
|
16, 24, 32 |
16 |
|
|
16 - 40, с шагом 4 |
16 |
|
|
8 - 56 |
8 |
|
|
16 |
8 |
|
|
8 - 128 |
8 |
|
|
8 - 128 |
16 |
|
|
16, 24, 32 |
16 |
|
|
16, 24, 32 |
16 |
|
|
16 |
8 |
|
Поточное шифрование |
|||
|
16, 32 |
1 |
Размер (IV) составляет 8 или 12 байт.Для размера 8 initial_counter - это 64-битное целое число, для размера 12 - 32-битное. |
|
5 - 256 |
1 |
|
|
4x |
1 |
Размер (IV) составляет 4y байт, длина не зависит от размера ключа. |
ENCRYPT
select encrypt('897897' using sober128 key 'AbcdAbcdAbcdAbcd' iv '01234567')
from rdb$database;
RSA_PRIVATE()
DSQL, PSQL
RSA_PRIVATE (size)
Параметр | Описание |
---|---|
size |
Размер ключа в байтах. |
VARBINARY
Функция RSA_PRIVATE
возвращает RSA закрытый ключ заданной длины (в байтах) в PKCS#1 формате как строку VARBINARY
.
RSA_PRIVATE
select rdb$set_context('USER_SESSION', 'private_key', rsa_private(256))
from rdb$database;
RSA_PUBLIC()
DSQL, PSQL
RSA_PUBLIC (private-key)
Параметр | Описание |
---|---|
private-key |
RSA закрытый ключ. |
VARBINARY
Функция RSA_PUBLIC
возвращает RSA открытый ключ для заданного RSA закрытого ключа.Оба ключа должны быть в PKCS#1 формате.
RSA_PUBLIC
Закрытый ключ должен быть инициализирован ранее см.пример в RSA_PRIVATE
select rdb$set_context('USER_SESSION', 'public_key',
rsa_public(rdb$get_context('USER_SESSION', 'private_key')))
from rdb$database;
RSA_ENCRYPT()
DSQL, PSQL
RSA_ENCRYPT (<data> KEY <public_key> [LPARAM <tag>] [HASH <hash>]) <hash> ::= { MD5 | SHA1 | SHA256 | SHA512 }
Параметр | Описание |
---|---|
data |
Данные (строка или BLOB) для шифрования. |
public_key |
Открытый RSA ключ, который возвращает функция |
tag |
Дополнительный системный тег, который можно применять для определения того, какая система закодировала сообщение.Значением по умолчанию является |
hash |
Алгоритм хеширования.По умолчанию SHA256. |
VARBINARY
Заполняет данные, используя заполнение OAEP, и шифрует их, используя открытый ключ RSA.Обычно используется для шифрования коротких симметричных ключей, которые затем используются в блочных шифрах для шифрования сообщения.
RSA_ENCRYPT
Открытый ключ должен быть инициализирован ранее см.пример в [fblangref-scalarfuncs-rsa_public]
select rdb$set_context('USER_SESSION', 'msg',
rsa_encrypt('Some message' key rdb$get_context('USER_SESSION', 'public_key')))
from rdb$database;
RSA_DECRYPT()
DSQL, PSQL
RSA_DECRYPT (<data> KEY <private_key> [LPARAM <tag>] [HASH <hash>]) <hash> ::= { MD5 | SHA1 | SHA256 | SHA512 }
Параметр | Описание |
---|---|
data |
Данные (строка или BLOB) для дешифрования. |
private_key |
Закрытый RSA ключ, который возвращает функция |
tag |
Дополнительный системный тег.Должно быть тем же самым значением, которое передавалось |
hash |
Алгоритм хеширования.По умолчанию SHA256. |
VARCHAR
Расшифровывает с использованием закрытого ключа RSA, и удаляет OAEP дополненные данные.
Закрытый ключ должен быть инициализирован ранее см. пример в [fblangref-scalarfuncs-rsa_private].Данные для расшифровки используются из примера в [fblangref-scalarfuncs-rsa_encrypt].
select RSA_DECRYPT(rdb$get_context('USER_SESSION', 'msg')
key rdb$get_context('USER_SESSION', 'private_key'))
from RDB$DATABASE;
RSA_SIGN_HASH()
DSQL, PSQL
RSA_SIGN_HASH (<data> KEY <private_key> [HASH <hash>] [SALT_LENGTH <length>]) <hash> ::= { MD5 | SHA1 | SHA256 | SHA512 }
Параметр | Описание |
---|---|
data |
Данные (строка или BLOB) для кодирования. |
private_key |
Закрытый RSA ключ, который возвращает функция |
hash |
Алгоритм хеширования.По умолчанию SHA256. |
length |
Указывает на длину желаемой соли и, как правило, должен быть небольшим.Хорошее значение от 8 до 16. |
VARBINARY
Выполняет PSS-кодирование дайджеста сообщения для подписи и подписывает его с использованием закрытого ключа RSA.Возвращает подпись сообщения.
RSA_SIGN_HASH
Закрытый ключ должен быть инициализирован ранее см.пример в [fblangref-scalarfuncs-rsa_private].
select rdb$set_context('USER_SESSION', 'msg',
rsa_sign_hash(crypt_hash('Test message' using sha256)
key rdb$get_context('USER_SESSION', 'private_key')))
from rdb$database;
RSA_VERIFY_HASH()
DSQL, PSQL
RSA_VERIFY_HASH (<data> SIGNATURE <signature> KEY <public_key> [HASH <hash>] [SALT_LENGTH <length>]) <hash> ::= { MD5 | SHA1 | SHA256 | SHA512 }
Параметр | Описание |
---|---|
data |
Данные (строка или BLOB) для кодирования. |
signature |
Подпись.Должно быть значением возвращаемым функцией |
public_key |
Открытый RSA ключ, который возвращает функция |
hash |
Алгоритм хеширования.По умолчанию SHA256. |
length |
Указывает на длину желаемой соли и, как правило, должен быть небольшим.Хорошее значение от 8 до 16. |
BOOLEAN
Выполняет PSS-кодирование дайджеста сообщения для подписи и проверяет его цифровую подпись, используя открытый ключ RSA.Возвращает результат проверки подписи.
RSA_VERIFY_HASH
Открытый ключ должен быть инициализирован ранее см. пример в [fblangref-scalarfuncs-rsa_public].Цифровая подпись получена ранее с помощью функции [fblangref-scalarfuncs-rsa_sign_hash].
select rsa_verify_hash(crypt_hash('Test message' using sha256)
signature rdb$get_context('USER_SESSION', 'msg')
key rdb$get_context('USER_SESSION', 'public_key'))
from rdb$database;
CAST()
DSQL, PSQL
CAST(value | NULL AS <type>) <type> ::= <datatype> | [TYPE OF] domain | TYPE OF COLUMN relname.colname <datatype> ::= <scalar_datatype> | <blob_datatype> | <array_datatype> <scalar_datatype> ::= См. Синтаксис скалярных типов данных <blob_datatype> ::= См. Синтаксис типа данных BLOB <array_datatype> ::= См. Синтаксис массивов
Параметр | Описание |
---|---|
value |
SQL выражение. |
datatype |
Тип данных SQL. |
domain |
Домен. |
relname |
Имя таблицы или представления. |
colname |
Имя столбца таблицы или представления. |
<type>
.
Функция CAST служит для явного преобразования данных из одного типа данных в другой тип данных или домен.Если это невозможно будет выдана ошибка.
Из типа | В тип |
---|---|
Числовые типы |
Числовые типы, |
|
|
|
|
|
|
|
|
Имейте в виду, что иногда информация может быть потерянна, например, когда вы преобразуете тип TIMESTAMP
к DATE
.Кроме того, тот факт, что типы совместимы для функции CAST
, ещё не гарантирует, что преобразование будет успешным.“CAST (123456789 AS SMALLINT)” безусловно приведёт к ошибке, так же как и “CAST('Judgement Day' as DATE)”.
Вы можете применить преобразование типа к параметрам оператора:
CAST (? AS INTEGER)
Это дает вам контроль над типом полей ввода.
При преобразовании к домену должны быть удовлетворены любые ограничения (NOT NULL и/или CHECK) объявленные для домена, иначе преобразование не будет выполнено.Помните, что проверка CHECK проходит, если его вычисление даёт TRUE или UNKNOWN (NULL). Для следующих операторов:
CREATE DOMAIN quint AS INT CHECK (VALUE >= 5000)
SELECT CAST (2000 AS quint) FROM rdb$database -- (1)
SELECT CAST (8000 AS quint) FROM rdb$database -- (2)
SELECT CAST (null AS quint) FROM rdb$database -- (3)
только (1) завершится с ошибкой.
При использовании модификатора TYPE OF
выражение будет преобразовано к базовому типу домена, игнорируя любые ограничения.Для домена quint, объявленного выше, оба преобразования будут эквивалентны и оба будут успешно выполнены:
SELECT CAST (2000 AS TYPE OF quint) FROM rdb$database
SELECT CAST (2000 AS INT) FROM rdb$database
При использовании TYPE OF
с [VAR]CHAR
типом, его набор символов и порядок сортировки (collate) сохраняются.
CREATE DOMAIN iso20 VARCHAR(20) CHARACTER SET iso8859_1;
CREATE DOMAIN dunl20 VARCHAR(20) CHARACTER SET iso8859_1 COLLATE du_nl;
CREATE TABLE zinnen (zin VARCHAR(20));
COMMIT;
INSERT INTO zinnen VALUES ('Deze');
INSERT INTO zinnen VALUES ('Die');
INSERT INTO zinnen VALUES ('die');
INSERT INTO zinnen VALUES ('deze');
SELECT CAST(zin AS TYPE OF iso20) FROM zinnen ORDER BY 1;
-- returns Deze -> Die -> deze -> die
SELECT CAST(zin AS TYPE OF dunl20) FROM zinnen ORDER BY 1;
-- returns deze -> Deze -> die -> Die
Warning
|
Если определение домена изменяется, то существующие преобразования к домену или его типу могут стать ошибочными.Если такие преобразования происходят в PSQL модулях, то их ошибки могут быть обнаружены.См. Поле RDB$VALID_BLR. |
Разрешено преобразовывать выражение к типу столбца существующей таблицы или представления.При этом будет использован только сам тип, для строковых типов будет использован так же набор символов, но не последовательность сортировки.Ограничения и значения по умолчанию исходного столбца не применяются.
CREATE TABLE ttt (
s VARCHAR(40) CHARACTER SET utf8 COLLATE unicode_ci_ai
);
COMMIT;
SELECT CAST ('Jag har många vänner' AS TYPE OF COLUMN ttt.s)
FROM rdb$database;
Warning
|
Если определение столбца изменяется, то существующие преобразования к его типу могут стать ошибочными.Если такие преобразования происходят в PSQL модулях, то их ошибки могут быть обнаружены.См. Поле RDB$VALID_BLR. |
SELECT CAST ('12' || '-June-' || '1959' AS DATE) FROM rdb$database
Заметьте, что в некоторых случаях вы можете не использовать синтаксис преобразования как в примере выше, так как Firebird поймёт из контекста (сравнение с полем типа DATE
) как интерпретировать строку:
UPDATE People SET AgeCat = 'Old'
WHERE BirthDate < '1-Jan-1943'
Но это не всегда возможно.Преобразование в примере ниже не может быть опущено, так как система будет пытаться преобразовать строку к числу чтобы вычесть из неё число:
SELECT CAST('TODAY' AS DATE) - 7 FROM rdb$database
BIN_AND()
DSQL, PSQL
BIN_AND (number, number [, number ...])
Параметр | Описание |
---|---|
number |
Целое число. |
SMALLINT
, INTEGER
, BIGINT
или INT128
Функция BIN_AND
возвращает результат побитовой операции AND (И) аргументов.
BIN_NOT()
DSQL, PSQL
BIN_NOT (number)
Параметр | Описание |
---|---|
number |
Целое число. |
SMALLINT
, INTEGER
, BIGINT
или INT128
Функция BIN_NOT
возвращает результат побитовой операции NOT
над аргументом.
BIN_OR()
DSQL, PSQL
BIN_OR (number, number [, number ...])
Параметр | Описание |
---|---|
number |
Целое число. |
SMALLINT
, INTEGER
, BIGINT
или INT128
Функция BIN_OR
возвращает результат побитовой операции OR (ИЛИ) аргументов.
BIN_SHL()
DSQL, PSQL
BIN_SHL (number, shift)
Параметр | Описание |
---|---|
number |
Целое число. |
shift |
Количество бит, на которое смещается значение number. |
BIGINT
или INT128
.
Функция BIN_SHL
возвращает первый параметр, побитно смещённый влево на значение второго параметра, т.е. a << b
или a·2b
.
BIN_SHR()
DSQL, PSQL
BIN_SHR (number, shift)
Параметр | Описание |
---|---|
number |
Целое число. |
shift |
Количество бит на которое смещается значение number. |
BIGINT
или INT128
.
Функция BIN_SHR
возвращает первый параметр, побитно смещённый вправо на значение второго параметра, т.е. a >> b
или a/2b
.
Выполняемая операция является арифметическим сдвигом вправо (SAR), а это означает, что знак первого операнда всегда сохраняется.
BIN_XOR()
DSQL, PSQL
BIN_XOR (number, number [, number ...])
Параметр | Описание |
---|---|
number |
Целое число. |
SMALLINT
, INTEGER
, BIGINT
или INT128
Функция BIN_XOR
возвращает результат побитовой операции XOR
аргументов.