Чтение онлайн

ЖАНРЫ

Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ

Борри Хелен

Шрифт:

Если для набора символов вы задаете недвоичную сортировку (отличную от сортировки по умолчанию), то размер индексного ключа может стать больше, чем хранимая строка, если сортировка включает правила предшествования второго, третьего или четвертого порядка.

Например, недвоичные сортировки для IS08859_1 используют полные словари с пробелами и знаками пунктуации с четырьмя порядками значений.

* Первый порядок: А отличается от В.

* Второй порядок: А отличается от А.

* Третий порядок: А отличается от а.

* Четвертый порядок: важным является тип знака

пунктуации (дефис, пробел, апостроф).

Например:

Greenfly

Green fly

Green-fly

Greensleeves

Green sleeves

Green spot

Если же пробелы и знаки пунктуации трактуются как символы первого порядка, то тот же самый список будет отсортирован следующим образом:

Greenfly

Greensleeves

Green fly

Green sleeves

Green spot

Green-fly

Как недвоичные сортировки могут ограничить размер индекса

Когда создается индекс, он использует последовательности сортировки, определенные для каждого текстового фрагмента индекса. При использовании однобайтового набора символов ISO8859_1 с сортировкой по умолчанию структура индекса может содержать приблизительно 252 символа (меньше, если это многосегментный индекс). Если же вы выбираете недвоичную сортировку для ISO8859_1 (в том числе это относится к сортировке PXW_CYRL кодировки WIN1251), то структура индекса может содержать только 84 символа, несмотря на то, что символы в индексируемом столбце занимают только один байт каждый.

! ! !

ВНИМАНИЕ! Некоторые сортировки ISO8859_1, например DE_DE, требуют в среднем три байта на символ для индексируемого столбца.

. ! .

Пользовательские наборы символов и сортировки

Существует возможность создать собственные наборы символов и сортировки и заставить сервер Firebird загружать их из библиотеки, которая должна называться fbintl2, чтобы ее можно было распознать и подключить.

Также можно реализовать пользовательские наборы символов и сортировки с использованием функций, определенных пользователем (UDF) для транслитерации входных данных. Сервер Firebird 1.5 автоматически использует UDF со специальными именами, чтобы их можно было распознать как наборы символов и сортировки. Имя 'USER_CHARSET_nnn' указывает набор символов, в то время как 'USER_TRANSLATE_nnn_nnn' и 'USER_TEXTTYPE_nnn' указывает набор символов плюс последовательность сортировки (nnn представляет трехсимвольное число, обычно в диапазоне от 128 до 254).

Это сложная тема, выходящая за пределы данной книги. Разработчик для fbintl2 встраиваемых пользователем наборов символов David Brookestone Schnepper создал свободно распространяемый комплект "сделай сам", который содержит пример кода С, отображения и инструкции, доступный наПоскольку комплект поставки содержит ясные инструкции по созданию наборов символов, он также будет вам полезным справочником, если вы планируете использовать подход UDF для реализации пользовательского набора символов.

Добавление
собственных алиасов

В экстремальной ситуации - когда вы используете нестандартную операционную систему, которая требует имя набора символов, не поддерживаемое в Firebird в качестве алиаса - вы можете добавить алиас. Для этого не существует простого способа; требуется прямая корректировка системных таблиц- такая практика, как общее правило, должна быть исключена. Прежде чем вы решите добавить новый пользовательский алиас, убедитесь, что Firebird не поддерживает нужный вам алиас - просмотрите в приложении 8 списки алиасов около каждого имени набора символов.

Инсталляция пользовательских алиасов включает прямое добавление строки в таблицу RDB$TYPES. Получите идентификатор набора символов, для которого вы собираетесь создать алиас - в таблице RDB$CHARACTER_SETS это значение столбца RDB$CHARACTER_SET_ID - и убедитесь, что у вас правильный строковый литерал, который ваша операционная система распознает как набор символов, который вы хотите поддерживать.

Предположим, вы хотите добавить алиас для набора символов ISO8859_1, который ваша ОС сможет распознать по литералу 'LC_ISO88591'. Во-первых, получите идентификатор набора символов по запросу к таблице RDB$CHARACTER_SETS, используя утилиту isql или другой интерактивный инструмент запросов:

SELECT RDB$CHARACTER_SET_ID

FROM RDB$CHARACTER_SETS

WHERE RDB$CHARACTER_SET_NAME = 'ISO8859_1';

Этот пример вернет идентификатор набора символов "21". Затем подготовьте и выполните оператор INSERT для добавления вашего алиаса в таблицу RDB$TYPES:

INSERT INTO RDB$TYPES (

RDB$FIELD_NAME, RDB$TYPE, RDB$TYPE_NAME)

VALUES ('RDB$CHARACTER_SET_NAME', 21, 'LC_ISO88591');

Эта техника относительно безболезненна, если ваш пользовательский алиас представляет набор символов, нужный для определения столбца или домена, но она не требуется для набора символов базы данных по умолчанию. Просто убедитесь, что определение алиаса существует до того, как вы создаете столбец или домен, которым нужно его использовать.

Существует проблема типа "уловка-22", если ваша операционная система по- настоящему не может поддерживать набор символов или алиас для набора символов, который вам нужно использовать по умолчанию. Ваша база может "узнать" о вашем алиасе только после создания базы данных, когда таблица RDB$TYPES уже существует. Набор символов базы данных по умолчанию определяется в CREATE DATABASE, а в этот момент доступны только объявленные в системе алиасы. В тот момент, когда RDB$TYPES существует, уже поздно назначать набор символов по умолчанию.

Поскольку в настоящий момент Firebird не предоставляет способов изменения атрибута набора символов по умолчанию - это не поддерживается в синтаксисе ALTER DATABASE, - существует только один способ: сначала создать базу данных, а затем, до того, как что-нибудь с ней делать, установить, как был описан ваш алиас, подтвердить транзакцию и изменить напрямую заголовочную запись базы данных:

UPDATE RDB$DATABASE

SET RDB$CHARACTER_SET_NAME = 'LC_ISO88591';

COMMIT;

! ! !

Поделиться с друзьями: