Spec-Zone .ru
спецификации, руководства, описания, API

10.4.1. Типы Реализации сопоставления

MySQL реализует несколько типов сопоставлений:

Простые сопоставления для 8-разрядных наборов символов

Этот вид сопоставления реализуется, используя массив 256 весов, который определяет непосредственное отображение от символьных кодов до весов. latin1_swedish_ci пример. Это - нечувствительное к регистру сопоставление, таким образом, у верхнего регистра и строчных версий символа есть те же самые веса, и они сравниваются как равный.

mysql> SET NAMES 'latin1' COLLATE
        'latin1_swedish_ci';Query OK, 0 rows affected (0.01 sec)mysql> SELECT HEX(WEIGHT_STRING('a')), HEX(WEIGHT_STRING('A'));+-------------------------+-------------------------+| HEX(WEIGHT_STRING('a')) | HEX(WEIGHT_STRING('A')) |+-------------------------+-------------------------+| 41                      | 41                      |+-------------------------+-------------------------+1 row in set (0.01 sec)mysql> SELECT 'a' = 'A';+-----------+| 'a' = 'A' |+-----------+|         1 |+-----------+1 row in set (0.12 sec)

Для инструкций реализации см. Раздел 10.4.3, "Добавляя Простое Сопоставление к 8-разрядному Набору символов".

Сложные сопоставления для 8-разрядных наборов символов

Этот вид сопоставления реализуется, используя функции в исходном файле C, которые определяют, как упорядочить символы, как описано в Разделе 10.3, "Добавляя Набор символов".

Сопоставления для многобайтовых наборов символов не-Unicode

Для этого типа сопоставления 8-разрядные (однобайтовые) и многобайтовые символы обрабатываются по-другому. Для 8-разрядных символов символьные коды отображаются на веса нечувствительным к регистру способом. (Например, однобайтовые символы 'a' и 'A' у обоих есть вес 0x41.) Для многобайтовых символов, есть два типа отношения между символьными кодами и весами:

Для инструкций реализации см. Раздел 10.3, "Добавляя Набор символов".

Сопоставления для многобайтовых наборов символов Unicode

Некоторые из этих сопоставлений основаны на Алгоритме сопоставления Unicode (UCA), другие не.

У сопоставлений Non-UCA есть непосредственное отображение от символьного кода до веса. В MySQL такие сопоставления являются нечувствительными к регистру и не чувствительными к диакритическим знакам. utf8_general_ci пример: 'a', 'A', 'À', и 'á' у каждого есть различные символьные коды, но у всех есть вес 0x0041 и сравнитесь как равный.

mysql> SET NAMES 'utf8' COLLATE
        'utf8_general_ci';Query OK, 0 rows affected (0.00 sec)mysql> CREATE
        TABLE t1    -> (c1 CHAR(1) CHARACTER SET UTF8 COLLATE
        utf8_general_ci);Query OK, 0 rows affected (0.01 sec)mysql> INSERT
        INTO t1 VALUES ('a'),('A'),('À'),('á');Query OK, 4 rows affected (0.00 sec)Records: 4  Duplicates: 0  Warnings: 0mysql> SELECT c1, HEX(c1), HEX(WEIGHT_STRING(c1)) FROM t1;+------+---------+------------------------+| c1   | HEX(c1) | HEX(WEIGHT_STRING(c1)) |+------+---------+------------------------+| a    | 61      | 0041                   || A    | 41      | 0041                   || À    | C380    | 0041                   || á    | C3A1    | 0041                   |+------+---------+------------------------+4 rows in set (0.00 sec)

У UCA-на-основе сопоставлений в MySQL есть эти свойства:

Отображение "много символов ко многим весам" также возможно (это - сокращение с расширением), но не поддерживается MySQL.

Для инструкций реализации, для non-UCA сопоставления, см. Раздел 10.3, "Добавляя Набор символов". Для сопоставления UCA см. Раздел 10.4.4, "Добавляя Сопоставление UCA к Набору символов Unicode".

Разные сопоставления

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