Рекомендуется использовать подзапрос (см. главы 21 и 22), который ограничивает вызовы функции только при ненулевых значениях. В диалекте 3 есть другое решение: использовать выражение CASE (см. главу 21) для исключения вызова EXTRACT() при нулевых датах.
Пора дальше
Следующая глава охватывает большую тему использования символьных (строковых) типов данных в Firebird, включая важные вопросы определения и работы с интернациональными наборами символов и порядком сортировки для баз данных и столбцов.
ГЛАВА 11. Символьные типы данных.
Firebird поддерживает символьные (строковые) типы данных фиксированной и переменной длины. Они могут быть определены для локального использования в любом наборе символов, выбираемом из большого списка. Символьные типы фиксированной длины не могут превышать 32 767 байт абсолютной длины; для типов переменной длины этот предел уменьшается на два байта, которые при сохранении строки содержат счетчик символов.
Firebird хранит строки очень экономно, используя простой алгоритм сжатия данных, даже если это тип CHAR или NCHAR. В том случае, когда вы хотите объявить очень большой строковый столбец, помните, что существует множество причин не использовать длинные строки - ограничения клиентской памяти или размеров индекса, а для Firebird 1.0.x еще и декомпрессия строк фиксированной и переменной длины в объявленную длину до того, как они покинут сервер.
Основы использования строк
Атрибут символьных типов CHARACTER SET важен не только для совместимости с интерфейсом локализованных приложений, но также в некоторых случаях для определения размера столбца. Отдельные наборы символов используют несколько байтов для хранения одного символа- обычно два или три в Firebird. Когда используются такие наборы символов, максимальный размер уменьшается в два или три раза.
! ! !
ПРИМЕЧАНИЕ. Атрибут CHARACTER SET в объявлении является необязательным. Если никакой набор символов не определяется на уровне столбца, то атрибут CHARACTER SET устанавливается в значение набора символов по умолчанию для базы данных. Механизм определения набора символов для столбцов и переменных обсуждается более подробно позже в этой главе.
. ! .
Попытка помещения в строковый столбец Firebird строки с длиной, превышающей объявленную, вызывает ошибку переполнения.
Ограничителем строк в Firebird является символ ASCII 39, или одиночная кавычка, или апостроф, например,
StringVar = 'This is a string.';
Двойные кавычки вовсе запрещены для ограничения строк. Вы должны помнить это, если соединяетесь с БД Firebird, используя код приложения, написанного для баз данных InterBase 5, где разрешалось использовать кавычки в качестве ограничителя строк. Строки должны быть исправлены также в исходном коде хранимых процедур и триггеров в базе данных InterBase 5, если вы планируете перекомпилировать их для Firebird.
Firebird использует стандартный в SQL символ для конкатенации (соединения) строк: двойной символ ASCII с кодом 124, известный как двойная вертикальная черта (||). Он может быть использован для конкатенации строковых констант, строковых выражений и/или значений столбцов, например:
MyBiggerString = 'You are my sunshine, ' || FirstName || ' my only sunshine.';
Символьные элементы могут соединяться с числами и числовыми выражениями для получения алфавитно-цифровых строк. Например, для конкатенации символа '#' с целым:
NEW.TICKET_NOMBER = '#' || NEW.PK_INTEGER;
! ! !
ВНИМАНИЕ! He используйте выражения конкатенации, где один из элементов может иметь значение NULL. Результатом любой конкатенации, содержащей NULL, будет NULL.
. ! .
Как правило, Firebird не поддерживает использование управляющих символов для включения непечатаемых кодов или последовательностей в строковые поля. Единственным исключением является "дублирование" символа апострофа (ASCII 39) для включения его в качестве хранимого символа и исключения его интерпретации как терминального ограничителя строки:
. . .
SET HOSTELRY = 'О''Flaherty''s Pub'
. . .
В строках можно хранить непечатаемые символы. Может быть объявлена функция UDF Asciichar (ascii_значение) в библиотеке ib udf, чтобы дать возможность передавать в строки такие символы или их последовательности. Следующий оператор выводит множество текстовых полей - например, во внешний файл - с символами возврата каретки и перевода строки в последнем поле:
INSERT INTO EXTFILE(DATA1, DATA1, DATA3, CRLF)
VALUES ('String1', 'String2', 'String3', Ascii_Char(13) || Ascii_Char(10));
Читать дальше