Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
SELECT
С. RDB$CHARACTER_SET_NAME,
T.RDB$TYPE_NAME
FROM RDB$TYPES T
JOIN RDB$CHARACTER_SETS С
ON C.RDB$CHARACTER_SET_ID = T.RDB$TYPE
WHERE T.RDB$FIELD_NAME = 'RDB$CHARACTER_SET_NAME'
ORDER BY 1 ;
! ! !
ПРИМЕЧАНИЕ. Для того чтобы использовать наборы символов, отличные от NONE, ASCII, OCTETS и UNICODE_FSS, необходимо иметь библиотеку fbintl в каталоге /intl корневого каталога Firebird.
. ! .
Важно
Неиндексируемые столбцы, использующие последовательность сортировки по умолчанию, могут хранить не более (количество символов)*(количество байтов на символ) для типа данных. Например, VARCHAR(32765) с набором символов ISO_8859_1 может хранить не более 32 765 символов, тогда как при наборе символов UNICODE_FSS (который использует три байта на символ) максимальное количество 10 291 символ.
Если столбец предполагается индексировать и/или изменить предложением COLLATE, должно быть добавлено значительное количество "запасных" байтов. Даже наименее требовательный индекс - один столбец VARCHAR, использующий однобайтовый набор символов и последовательность сортировки по умолчанию - ограничен размером 252 байта для Firebird версии 1.5 и выше. Для столбцов с многобайтовыми наборами символов количество символов меньше, чем 252 / (количество байтов на символ). Многостолбцовые индексы требуют больше байтов, чем одностолбцовые, а те, которые используют последовательность сортировки не по умолчанию, требуют еще больше.
Более подробно об этих эффектах см. разд. "Последовательность сортировки и размер индекса" далее в этой главе.
! ! !
СОВЕТ. При проектировании столбцов всегда рассматривайте возможные требования с точки зрения использования набора символов, индексирования и ключа. Всегда держите "черновую" таблицу в разрабатываемой базе данных для тестирования ограничений индексов и ключей.
. ! .
Хранение столбцов BLOB, которые не являются индексируемыми, никак не ограничивается использованием набора символов.
Если вы не указываете набор символов по умолчанию для базы данных в объявлении CREATE DATABASE, то набор символов по умолчанию устанавливается в NONE. Набор символов NONE не предполагает никакого набора символов для текстовых столбцов, сохраняя данные точно в том виде, в каком они были введены. Если клиентское соединение не указывает набора символов, то данные также будут отыскиваться точно так, как они были введены. Алфавитно-цифровое упорядочение ограничено упорядочением кодов ASCII, а преобразование верхний/нижний регистр поддерживается только в кодах U.S.ASCII 65-90 и 97-102 соответственно.
Указывайте допустимый код набора символов в предложении DEFAULT CHARACTER SET:
CREATE DATABASE '/data/adatabase.fdb'
. . .
DEFAULT CHARACTER SET WIN1251;
Более
Атрибут набора символов может быть добавлен к индивидуальному определению домена, столбца таблицы или переменной PSQL типа CHAR, VARCHAR или BLOB SUB_TYPE 1 для перекрытия набора символов по умолчанию базы данных.
Например, следующий фрагмент скрипта создает базу данных с набором символов по умолчанию ISO8859_1 и таблицу, содержащую различные версии языка похожих данных в отдельных столбцах:
CREATE DATABASE '/data/authors.fdb' DEFAULT CHARACTER SET ISO8859_1;
CREATE TABLE COUNTRY_INTL(
CNTRYCODE BIGINT NOT NULL,
NOM_FR VARCHAR(30) NOT NULL,
/* использует набор символов по умолчанию */
NOM_EN VARCHAR(30), /* использует набор символов по умолчанию */
NOM_RU VARCHAR(30) CHARACTER SET WINI251,
NOM_JP VARCHAR(30) CHARACTER SET SJIS_0208
Другой фрагмент того же скрипта создает домен для хранения данных BLOB В наборе символов кириллицы:
CREATE DOMAIN MEMO_RU AS BLOB SUB_TYPE 1
CHARACTER SET WIN1251;
Позже в этом скрипте мы создаем таблицу, которая хранит некоторый текст в кириллице:
CREATE TABLE NOTES_RU (
DOC_ID BIGINT NOT NOLL,
NOTES MEMO_RU
);
Следующий фрагмент определяет хранимую процедуру, которая преобразует входную строку в другой набор символов перед сохранением ее в таблице:
CREATE PROCEDURE CONVERT_NOTES (
INPUT_TEXT VARCHAR(300) ) AS
DECLARE VARIABLE CONV_STRING WARCHAR(300)
CHARACTER SET WIN1251;
BEGIN
IF (INPUT JTEXT IS NOT NULL) THEN
BEGIN
CONV_STRING = _WIN1251 ' ' || : INPUT_TEXT;
/* использует INTRODUCER */
INSERT INTO NOTES_RU (DOC_ID, NOTES)
VALUES (GEN_ID (ANYGEN, 1) , :CONV_STRING) ;
END
END ^
Создание доменов объясняется в главе 13. Полный синтаксис оператора CREATE TABLE описан в главе 15. Объявление переменных в PSQL см. в главе 30.
Набор символов для текстовых значений в операторе интерпретируется в соответствии с набором символов соединения в процессе выполнения (а не в соответствии с набором символов, определенным для столбца при его создании), если только вы не зададите маркер набора символов (или "представитель") для указания другого набора символов.
Маркер набора символов - также известный как INTRODUCER- состоит из имени набора символов, перед которым стоит символ подчеркивания. Он требуется для "представления" входной строки, когда приложение клиента соединено с базой данных с использованием набора символов, отличного оттого, который определен для столбца в базе данных.