Spec-Zone.ru › MySQL 8.4

12.14.4.2 Поддержка синтаксиса LDML в MySQL

В этом разделе описывается синтаксис LDML, распознаваемый MySQL. Это подмножество синтаксиса, описанного в спецификации LDML, доступной по адресу http://www.unicode.org/reports/tr35/, которую следует изучить для получения дополнительной информации. MySQL распознаёт достаточно большое подмножество синтаксиса, что во многих случаях позволяет загрузить определение сортировки из репозитория данных об общих языковых настройках Unicode и вставить соответствующую часть (т. е. часть между тегами <rules> и </rules>) в файл MySQL Index.xml. Описанные здесь правила поддерживаются за исключением того, что сортировка символов происходит только на первичном уровне. Правила, которые указывают различия на вторичном или более высоком уровнях сортировки, распознаются (и, следовательно, могут быть включены в определения сортировки), но на первичном уровне обрабатываются как равенство.

Сервер MySQL генерирует диагностические сообщения при обнаружении проблем при разборе файла Index.xml. См. Раздел 12.14.4.3, “Диагностика во время разбора Index.xml”.

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

Символы, указанные в правилах LDML, могут быть записаны буквально или в формате \unnnn, где nnnn — шестнадцатеричное значение кода Юникода. Например, A и á можно записать буквально или как \u0041 и \u00E1. В шестнадцатеричных значениях цифры A до F нечувствительны к регистру; \u00E1 и \u00e1 эквивалентны. Для сортировок UCA 4.0.0 шестнадцатеричная нотация может использоваться только для символов в базовой многоязычной плоскости, а не для символов за пределами диапазона BMP от 0000 до FFFF. Для сортировок UCA 5.2.0 шестнадцатеричная нотация может использоваться для любого символа.

Сам файл Index.xml должен быть записан с кодировкой UTF-8.

Правила синтаксиса

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

  • Правило <reset> не определяет порядок самостоятельно. Вместо этого оно “сбрасывает” порядок для последующих правил сдвига, заставляя их применяться относительно заданного символа. Любое из следующих правил сбрасывает последующие правила сдвига, заставляя их применяться относительно буквы 'A':

    <reset>A</reset>
    
    <reset>\u0041</reset>
    
  • Правила сдвига <p>, <s> и <t> определяют первичные, вторичные и третичные различия одного символа от другого:

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

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

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

    Любое из этих правил определяет правило первичного сдвига для символа 'G':

    <p>G</p>
    
    <p>\u0047</p>
    
  • Правило сдвига <i> указывает, что один символ сортируется идентично другому. Следующие правила заставляют 'b' сортироваться так же, как и 'a':

    <reset>a</reset>
    <i>b</i>
    
  • Сокращенная синтаксическая запись сдвига задает несколько правил сдвига с использованием одной пары тегов. Следующая таблица показывает соответствие между сокращенными правилами синтаксиса сдвига и эквивалентными правилами без сокращений.

    Таблица 12.5 Сокращенная синтаксическая запись сдвига

    Таблица 12.5 Сокращенная синтаксическая запись сдвига
    Сокращенная запись Запись без сокращений
    <pc>xyz</pc> <p>x</p><p>y</p><p>z</p>
    <sc>xyz</sc> <s>x</s><s>y</s><s>z</s>
    <tc>xyz</tc> <t>x</t><t>y</t><t>z</t>
    <ic>xyz</ic> <i>x</i><i>y</i><i>z</i>

  • Расширение — это правило сброса, которое устанавливает точку отсчёта для последовательности символов. MySQL поддерживает расширения длиной от 2 до 6 символов. Следующие правила помещают 'z' выше, чем последовательность из трёх символов 'abc' на первичном уровне:

    <reset>abc</reset>
    <p>z</p>
    
  • Сжатие — это правило сдвига, которое сортирует последовательность символов. MySQL поддерживает сжатия длиной от 2 до 6 символов. Следующие правила помещают последовательность из трёх символов 'xyz' выше, чем 'a' на первичном уровне:

    <reset>a</reset>
    <p>xyz</p>
    
  • Длинные расширения и длинные сжатия могут использоваться вместе. Эти правила помещают последовательность из трёх символов 'xyz' выше, чем последовательность из трёх символов 'abc' на первичном уровне:

    <reset>abc</reset>
    <p>xyz</p>
    
  • Синтаксис обычного расширения использует элементы <x> плюс <extend> для задания расширения. Следующие правила помещают символ 'k' выше, чем последовательность 'ch' на вторичном уровне. То есть, 'k' ведет себя так, как если бы он расширялся до символа после 'c', за которым следует 'h':

    <reset>c</reset>
    <x><s>k</s><extend>h</extend></x>
    

    Этот синтаксис допускает длинные последовательности. Эти правила сортируют последовательность 'ccs' выше, чем последовательность 'cscs' на третичном уровне:

    <reset>cs</reset>
    <x><t>ccs</t><extend>cs</extend></x>
    

    Спецификация LDML описывает синтаксис обычного расширения как “хитрый.” Подробности см. в этой спецификации.

  • Синтаксис контекста предыдущего использования элементов <x> плюс <context>, чтобы указать, что контекст перед символом влияет на то, как он сортируется. Следующие правила помещают '-' выше, чем 'a' на вторичном уровне, но только когда '-' встречается после 'b':

    <reset>a</reset>
    <x><context>b</context><s>-</s></x>
    
  • Синтаксис контекста предыдущего может включать элемент <extend>. Эти правила помещают 'def' выше, чем 'aghi' на первичном уровне, но только когда 'def' следует за 'abc':

    <reset>a</reset>
    <x><context>abc</context><p>def</p><extend>ghi</extend></x>
    
  • Правила сброса допускают атрибут before. Обычно правила сдвига после правила сброса указывают символы, которые сортируются после символа сброса. Правила сдвига после правила сброса, имеющего атрибут before, указывают символы, которые сортируются перед символом сброса. Следующие правила помещают символ 'b' непосредственно перед 'a' на первичном уровне:

    <reset before="primary">a</reset>
    <p>b</p>
    

    Допустимые значения атрибута before указывают уровень сортировки по имени или эквивалентному числовому значению:

    <reset before="primary">
    <reset before="1">
    
    <reset before="secondary">
    <reset before="2">
    
    <reset before="tertiary">
    <reset before="3">
    
  • Правило сброса может указывать логическую точку сброса вместо буквального символа:

    <first_tertiary_ignorable/>
    <last_tertiary_ignorable/>
    <first_secondary_ignorable/>
    <last_secondary_ignorable/>
    <first_primary_ignorable/>
    <last_primary_ignorable/>
    <first_variable/>
    <last_variable/>
    <first_non_ignorable/>
    <last_non_ignorable/>
    <first_trailing/>
    <last_trailing/>
    

    Эти правила помещают 'z' выше, чем неигнорируемые символы, имеющие запись в таблице Default Unicode Collation Element Table (DUCET) и не являющиеся CJK, на первичном уровне:

    <reset><last_non_ignorable/></reset>
    <p>z</p>
    

    Логические позиции имеют кодовые точки, показанные в следующей таблице.

    Таблица 12.6 Логические позиции сброса, кодовые точки

    Таблица 12.6 Логические позиции сброса, кодовые точки
    Логическая позиция Кодовая точка Unicode 4.0.0 Кодовая точка Unicode 5.2.0
    <first_non_ignorable/> U+02D0 U+02D0
    <last_non_ignorable/> U+A48C U+1342E
    <first_primary_ignorable/> U+0332 U+0332
    <last_primary_ignorable/> U+20EA U+101FD
    <first_secondary_ignorable/> U+0000 U+0000
    <last_secondary_ignorable/> U+FE73 U+FE73
    <first_tertiary_ignorable/> U+0000 U+0000
    <last_tertiary_ignorable/> U+FE73 U+FE73
    <first_trailing/> U+0000 U+0000
    <last_trailing/> U+0000 U+0000
    <first_variable/> U+0009 U+0009
    <last_variable/> U+2183 U+1D371

  • Элемент <collation> допускает атрибут shift-after-method, который влияет на вычисление весов символов для правил сдвига. Атрибут имеет следующие допустимые значения:

    • simple: Вычислять веса символов так же, как для правил сброса, которые не имеют атрибута before. Это значение по умолчанию, если атрибут не указан.

    • expand: Используйте расширения для сдвигов после правил сброса.

    Предположим, что '0' и '1' имеют веса 0E29 и 0E2A, и мы хотим поместить все основные латинские буквы между '0' и '1':

    <reset>0</reset>
    <pc>abcdefghijklmnopqrstuvwxyz</pc>
    

    В режиме простого сдвига веса вычисляются следующим образом:

    'a' has weight 0E29+1
    'b' has weight 0E29+2
    'c' has weight 0E29+3
    ...
    

    Однако свободных позиций недостаточно, чтобы поместить 26 символов между '0' и '1'. В результате цифры и буквы перемешиваются.

    Чтобы решить эту проблему, используйте shift-after-method="expand". Тогда веса вычисляются так:

    'a' has weight [0E29][233D+1]
    'b' has weight [0E29][233D+2]
    'c' has weight [0E29][233D+3]
    ...
    

    233D — это вес символа 0xA48C в UCA 4.0.0, который является последним неигнорируемым символом (своего рода самым большим символом в сортировке, за исключением CJK). UCA 5.2.0 аналогичен, но использует 3ACA для символа 0x1342E.

Расширения LDML, специфичные для MySQL

Расширение правил LDML позволяет элементу <collation> включать необязательный атрибут version в тегах <collation>, чтобы указать версию UCA, на которой основан порядок сортировки. Если атрибут version опущен, его значение по умолчанию — 4.0.0. Например, эта спецификация указывает на порядок сортировки, основанный на UCA 5.2.0:

<collation id="nnn" name="utf8mb4_xxx_ci" version="5.2.0">
...
</collation>

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/ldml-rules.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API