Spec-Zone .ru
спецификации, руководства, описания, API
|
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
.) Для многобайтовых символов, есть два типа отношения между символьными
кодами и весами:
Веса равные символьные коды. sjis_japanese_ci
пример
этого вида сопоставления. Многобайтовый символ 'ぢ'
имеет символьный код
0x82C0
, и вес также 0x82C0
.
mysql>CREATE TABLE t1
->(c1 VARCHAR(2) CHARACTER SET sjis COLLATE sjis_japanese_ci);
Query OK, 0 rows affected (0.01 sec)mysql>INSERT INTO t1 VALUES ('a'),('A'),(0x82C0);
Query OK, 3 rows affected (0.00 sec)Records: 3 Duplicates: 0 Warnings: 0mysql>SELECT c1, HEX(c1), HEX(WEIGHT_STRING(c1)) FROM t1;
+------+---------+------------------------+| c1 | HEX(c1) | HEX(WEIGHT_STRING(c1)) |+------+---------+------------------------+| a | 61 | 41 || A | 41 | 41 || ぢ | 82C0 | 82C0 |+------+---------+------------------------+3 rows in set (0.00 sec)
Символьные коды отображаются непосредственный на веса, но код не обязательно равен
весу. gbk_chinese_ci
пример этого вида сопоставления. Многобайтовый символ
'膰'
имеет символьный код 0x81B0
но вес 0xC286
.
mysql>CREATE TABLE t1
->(c1 VARCHAR(2) CHARACTER SET gbk COLLATE gbk_chinese_ci);
Query OK, 0 rows affected (0.33 sec)mysql>INSERT INTO t1 VALUES ('a'),('A'),(0x81B0);
Query OK, 3 rows affected (0.00 sec)Records: 3 Duplicates: 0 Warnings: 0mysql>SELECT c1, HEX(c1), HEX(WEIGHT_STRING(c1)) FROM t1;
+------+---------+------------------------+| c1 | HEX(c1) | HEX(WEIGHT_STRING(c1)) |+------+---------+------------------------+| a | 61 | 41 || A | 41 | 41 || 膰 | 81B0 | C286 |+------+---------+------------------------+3 rows in set (0.00 sec)
Для инструкций реализации см. Раздел 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 есть эти свойства:
Если у символа есть веса, каждый вес использует 2 байта (16 битов).
У символа могут быть нулевые веса (или пустой вес). В этом случае символ является игнорируемым. Пример: "НУЛЬ U+0000" не имеет веса и является игнорируемым.
У символа может быть один вес. Пример: 'a'
имеет вес
0x0E33
.
mysql>SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';
Query OK, 0 rows affected (0.05 sec)mysql>SELECT HEX('a'), HEX(WEIGHT_STRING('a'));
+----------+-------------------------+| HEX('a') | HEX(WEIGHT_STRING('a')) |+----------+-------------------------+| 61 | 0E33 |+----------+-------------------------+1 row in set (0.02 sec)
У символа может быть много весов. Это - расширение. Пример: немецкая буква 'ß'
(Лигатура SZ, или SHARP S), имеет вес 0x0FEA0FEA
.
mysql>SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';
Query OK, 0 rows affected (0.11 sec)mysql>SELECT HEX('ß'), HEX(WEIGHT_STRING('ß'));
+-----------+--------------------------+| HEX('ß') | HEX(WEIGHT_STRING('ß')) |+-----------+--------------------------+| C39F | 0FEA0FEA |+-----------+--------------------------+1 row in set (0.00 sec)
У многих символов может быть один вес. Это - сокращение. Пример: 'ch'
одна буква на чешском языке и имеет вес 0x0EE2
.
mysql>SET NAMES 'utf8' COLLATE 'utf8_czech_ci';
Query OK, 0 rows affected (0.09 sec)mysql>SELECT HEX('ch'), HEX(WEIGHT_STRING('ch'));
+-----------+--------------------------+| HEX('ch') | HEX(WEIGHT_STRING('ch')) |+-----------+--------------------------+| 6368 | 0EE2 |+-----------+--------------------------+1 row in set (0.00 sec)
Отображение "много символов ко многим весам" также возможно (это - сокращение с расширением), но не поддерживается MySQL.
Для инструкций реализации, для non-UCA сопоставления, см. Раздел 10.3, "Добавляя Набор символов". Для сопоставления UCA см. Раздел 10.4.4, "Добавляя Сопоставление UCA к Набору символов Unicode".
Разные сопоставления
Есть также несколько сопоставлений, которые не попадают ни в одну из предыдущих категорий.