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

NoteОбратите Внимание

Сортировка работает иначе в окружении с двух-байтовыми наборами символов (DBCS - Double-Byte Character Sets).

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

Несортированный Machine Основной Испанский

!@#$

пробел

пробел

пробел

1234

!@#$

!@#$

!@#$

пробел

1234

1234

1234

Caesar

Caesar

a

a

csar

Car

ab

Ab

Strasse

Char

b

b

strae

Czech

Caesar

Caesar

Car

Strasse

csar

Csar

Char

Ab

Car

Car

Czech

Csar

ar

ar

ab

Strae

Char

Czech

ar

ar

Czech

Char

a

a

Strasse

Strasse

b

b

strae

Strae

Принципы Порядка Сортировки

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

  • Избегайте Machine порядок сортировки, если вы хотите сортировать международные символы правильно, так как Machine сортирует международные символы в ASCII порядке. Например, обратите внимание, что ar следует за strae.

  • Символы с диакритическими знаками сортируются по другому, чем без них. Например, в основном и испанском порядке сортировки , заметьте, что  a стоит до  Ab, но ab стоит до b.       (!) Примечание переводчика: ДИАКРИТИЧЕСКИЙ - Располагающийся над или под буквами, иногда рядом с ними и указывающий на особый характер произношения соответствующих букв (о дополнительном знаке в алфавитах некоторых языков).

  • Лигатуры, например, сортируются также как и их эквивалент с увеличенным размером знака. Например, strae сортируется также, как Strasse и csar, какже как и Caesar.      (!) Примеяание переводчика:  ЛИГАТУРА - Знак в виде дуги над группой нот, обозначающий их связное исполнение (в нотной записи)

  • В некоторых языках, два символа сортируются как один. Например, в испанском Ch в Char сортируется, как символ между C и D.

Следующий раздел описывает, как задать порядок сортировки, проверить какой текущий и распознать его влияние.

Проверка Порядка Сортировки

Вы можете определить текущий порядок сортировки, воспользовавшись функцией SET ('COLLATE'). Например, вы можете сохранить текущий порядок, установить Machine текущим, произести необходимые действияи, затем восстановить исходный порядок сортировки, применив следующий код:

  CopyCode imageCopy Code
cCurrentOrder=SET('COLLATE')
SET COLLATE TO 'MACHINE'
*,,,
* действия, которые требуют Machine порядок сортировки
*,,,
SET COLLATE TO cCurrentOrder  && возврат к предыдущему порядку сортировки

Вы можете также определить порядок сортировки в индексах, используя функцию IDXCOLLATE().

Распознование Влияния Порядка Сортировки

Порядок сортировки влияет на результат сравнения символьных строк, SEEK, и SELECT - SQL, как это описано в следующем разделе.

Сравнение Строк

Все типы сортировок, кроме Machine и Unique Weight, игнорируют регистр. Это означает, что вам ненужно использовать UPPER( ) в выражениях индекса.

Текущий порядок сортировки влияет на сравнение строк. Например, когда установлен порядок сортировки General, то следующие выражения возвращают True (.T.):

  CopyCode imageCopy Code
?"A" = "a"
?"Strae"="Strasse"
?"" = "ae"

Однако, при использовании Machine порядка сортировки, все эти выражения вернут False (.F.). т.к. строки будут считаться совпадающими при точном сравнении, байт за байтом.

Оператор сравнения строк (= =) дает тот же результат, что и при сравнении значений или при использовании Machine порядка сортировки; это означает, что строки сравниваются по байтно. например, следующее выражение возвращает False (.F.):

  CopyCode imageCopy Code
? "Strae" == "Strasse"
NoteПримечание

Visual FoxPro игнорирует SET EXACT, когда применяется оператор сравнения символьных строк (= =).

Использование SEEK

Visual FoxPro игнорирует диакритические знаки, когда призводит частичный поиск. Частичный поиск происходит, когда задаете выражение меньшей длины, чем длина ключа. Если диакритические знаки важны, следует применять команды SCAN ... ENDSCAN или LOCATE вместо SEEK.

Приемущества использования SCAN и LOCATE вместо SEEK заключается в следующем:

  • SCAN и LOCATE различают диакритические знаки.

  • Visual FoxPro полностью оптимизирует выполнение SCAN или LOCATE, если установлен порядок сортировки Machine или Unique Weight, тогда как Visual FoxPro только частично оптимизирует результаты выполнения SEEK.

  • SCAN и LOCATE запоминают условия их запуска, делая возможным применят их в циклах по условию. В противоположность SEEK, который помещает указатель записи где-то в индексе, и SKIP продолжает перемещаться вниз по индексу от той позиции. Следовательно, SEEK может дать не тот результат, который вы желаете, при работе с международными данными.

Использование SELECT - SQL

Команда SELECT - SQL использует текущий порядок сортировки. Например, если у вас индексный дескриптор (index tag) основан на General порядке сортировки, а текущий порядок сортировки (возвращаемый по SET ('COLLATE')) - Machine, то результат выполнения SELECT SQL основан на Machine.

Чтобы применить текущий порядок сортировки, используйте оператор ORDER BY в SELECT - SQL.

Использование Индексов

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

  • Перестройте индексы, созданные в ранних версиях FoxPro, если вы хотите использовать другой порядок сортировки, отличный от Machine.

  • Перестройте dBASE индексы, чтобы воспользоваться приемуществами Visual FoxPro порядков сортировки.

  • Используйте команду REINDEX, чтобы перестроить индекс, т.к. она оставляет порядок сортировки неизмененным.

Смотрите Также