Книга: Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ

Последовательности сортировки

Последовательности сортировки

Каждый набор символов имеет последовательность сортировки (collate) по умолчанию, которая определяет, как символы сортируются и упорядочиваются. Последовательность сортировки определяет правила предшествования, которые Firebird использует для сортировки, сравнения и транслитерации символьных данных.

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

Последовательность сортировки для столбца задается при создании или модификации столбца. Если устанавливается на уровне столбца, то перекрывает любую установку последовательности сортировки на уровне домена.

Отображение доступных последовательностей сортировки

Следующий запрос дает список наборов символов с доступными последовательностями сортировки:

SELECT

С. RDB$CHARACTER_SET_NAME,

CO.RDB$COLLATION_NAME,

CO.RDB$COLLATION_ID,

CO.RDB$CHARACTER_SET_ID,

CO.RDB$COLLATION_ID * 256+ CO.RDB$CHARACTER_SET_ID AS TEXTTYPEID

FROM RDB$COLLATIONS CO

JOIN RDB$CHARACTER_SETS С

ON CO.RDB$CHARACTER_SET_ID = C.RDB$CHARACTER_SET_ID;

Именование последовательностей сортировки

Многие имена последовательностей Firebird используют соглашение по именованию XX_YY, где XX - двухбуквенный код языка, a YY - двухбуквенный код страны. Например, DE_DE - имя последовательности для немецкого языка, используемого в Германии, FR_FR - для французского языка, используемого во Франции, FR_CA - для французского языка, используемого в Канаде.

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

В этом разделе описывается задание последовательности сортировки для наборов символов в доменах и столбцах таблиц, в строковых сравнениях, в предложениях ORDER BY и GROUP BY.

Последовательность сортировки для столбца

Когда в таблице создается столбец CHAR или VARCHAR с использованием CREATE TABLE или ALTER TABLE, последовательность сортировки для столбца может быть задана с использованием предложения COLLATE. Предложение COLLATE особенно полезно для таких наборов символов, как ISO8859_1 и DOS437, которые поддерживают множество различных последовательностей сортировки.

К примеру, следующий динамический оператор ALTER TABLE добавляет новый столбец в таблицу и задает и набор символов, и последовательность сортировки:

ALTER TABLE 'EMP_CANADIEN'

ADD ADDRESS VARCHAR(40) CHARACTER SET WIN1251 NOT NULL COLLATE PXW_CYRL;

Полный синтаксис ALTER TABLE см. В главе 16.

Последовательность сортировки для строковых сравнений

Может оказаться необходимым задать последовательность сортировки при сравнении значений CHAR или VARCHAR в предложении WHERE, если сравниваемые значения используют различные последовательности сортировки, и это влияет на результат.

Чтобы указать используемую последовательность сортировки для значения в процессе сравнения, задайте предложение COLLATE после значения. Например, следующий фрагмент предложения WHERE задает конкретную последовательность сортировки для значения столбца в левой части операции сравнения при сравнении с входным параметром:

WHERE SURNAME COLLATE PXW SYRL >= :surname;

В этом случае при несоответствии последовательностей сортировки могут быть различные кандидаты для "больше чем" при разных последовательностях сортировки.

Последовательность сортировки в критериях сортировки

Когда столбцы CHAR или VARCHAR упорядочиваются в операторе SELECT, может оказаться необходимым указать порядок сортировки для упорядочивания, особенно если столбцы в предложении упорядочивания используют различные последовательности сортировки.

Чтобы задать последовательность сортировки для использования в упорядочиваемых столбцах, в предложение ORDER BY добавьте COLLATE после имени столбца. Например, в следующем предложении ORDER BY задаются последовательности сортировки для двух столбцов:

. . .

ORDER BY SURNAME COLLATE PXW_CYRL, FIRST_NAME COLLATE PXW_CYRL;

Полный синтаксис предложения ORDER BY CM. в главе 23.

Последовательность сортировки в предложении GROUP BY

Когда столбцы CHAR или VARCHAR группируются в операторе SELECT, может оказаться необходимым указать порядок сортировки для группирования, особенно если столбцы в предложении группировки используют различные последовательности сортировки.

Чтобы задать последовательность сортировки для использования в группируемых столбцах, в предложение GROUP BY добавьте COLLATE после имени столбца. Например, в следующем предложении GROUP BY задаются последовательности сортировки для нескольких столбцов:

. . .

GROUP BY ADDR_3 COLLATE PXW_CYRL, SURNAME COLLATE PXW_CYRL, FIRST_NAME COLLATE

PXW_CYRL;

Полный синтаксис предложения GROUP BY CM. В главе 23.

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

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

Например, недвоичные сортировки для 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, требуют в среднем три байта на символ для индексируемого столбца.

. ! .

Оглавление книги


Генерация: 4.142. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз