Книга: Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Последовательности сортировки
Разделы на этой странице:
- Отображение доступных последовательностей сортировки
- Именование последовательностей сортировки
- Последовательность сортировки для столбца
- Последовательность сортировки для строковых сравнений
- Последовательность сортировки в критериях сортировки
- Последовательность сортировки в предложении GROUP BY
- Последовательность сортировки и размер индекса
- Как недвоичные сортировки могут ограничить размер индекса
Последовательности сортировки
Каждый набор символов имеет последовательность сортировки (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, требуют в среднем три байта на символ для индексируемого столбца.
. ! .
- Элементы сортировки
- Основы сортировки
- 2.1.3. Экранированные последовательности Юникода
- Сортировка в убывающей последовательности
- Наборы символов и последовательность сортировки
- Эффективная работа с временными файлами сортировки
- Дополнительные национальные кодовые страницы и порядки сортировки
- Диаграммы последовательности действий
- Последовательности команд
- Завершение пирамидальной сортировки
- 10.4.3. Диаграммы последовательности
- Временное пространство сортировки