10.14.4.2 Поддержка синтаксиса LDML в MySQL
В этом разделе описывается синтаксис LDML, распознаваемый MySQL. Это подмножество синтаксиса, описанного в спецификации LDML, доступной по адресу http://www.unicode.org/reports/tr35/, которую следует проконсультировать для получения дополнительной информации. MySQL распознаёт достаточно большое подмножество синтаксиса, что во многих случаях позволяет загрузить определение сортировки из репозитория общих данных локалей Unicode и вставить соответствующую часть (то есть часть между тегами <rules> и </rules>) в файл MySQL Index.xml. Все описанные здесь правила поддерживаются, за исключением того, что сортировка символов происходит только на первичном уровне. Правила, определяющие различия на вторичном или более высоком уровнях сортировки, распознаются (и, следовательно, могут быть включены в определения сортировки), но на первичном уровне обрабатываются как равенство.
Сервер MySQL генерирует диагностические сообщения, когда при разборе файла Index.xml обнаруживаются проблемы. См. Раздел 10.14.4.3 «Диагностика во время разбора Index.xml».
Представление символов
Символы, указанные в правилах LDML, могут быть записаны буквально или в формате \u, где nnnnnnnn — шестнадцатеричное значение кода символа Unicode. Например, 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>
-
Сокращенная синтаксическая запись сдвига указывает на несколько правил сдвига, используя одну пару тегов. Следующая таблица показывает соответствие между сокращенными правилами сдвига и эквивалентными правилами без сокращений.
Таблица 10.5 Сокращенная синтаксическая запись сдвига
Таблица 10.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'выше на первичном уровне, чем неигнорируемые символы, имеющие запись в таблице элемента сортировки по умолчанию Unicode (DUCET), которые не являются CJK:<reset><last_non_ignorable/></reset> <p>z</p>
Логические позиции имеют кодовые точки, показанные в следующей таблице.
Таблица 10.6 Логические позиции сброса кодовых точек
Таблица 10.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="utf8_xxx_ci" version="5.2.0">
...
</collation>
© 2025 Oracle
Licensed under the GPLv2 License.