MySQL は複数のタイプの照合順序を実装します。
8 ビットの文字セットに対する単純な照合順序
この種の照合順序は、文字コードと重みの 1 対 1 のマッピングを定義した 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.14.3「8 ビットの文字セットへの単純な照合順序の追加」を参照してください。
8 ビット文字セットに対する複雑な照合順序
この種の照合順序は、セクション10.13「文字セットの追加」で説明しているように、文字を順序付けする方法を定義した C ソースファイル内の関数を使用して実装されます。
Unicode 以外のマルチバイト文字セットの照合順序
この種の照合順序では、8 ビット (シングルバイト) 文字とマルチバイト文字が異なる方法で処理されます。 8 ビットの文字の場合、文字コードは大文字と小文字を区別しない形式で重みにマップされます。 (たとえば、シングルバイト文字 'a'
と 'A'
はどちらも重みが 0x41
です。) マルチバイト文字の場合、文字コードと重みの間には、2 種類の関係があります。
-
重みが文字コードと等しい場合。
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: 0 mysql> 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)
-
文字コードが 1 対 1 で重みにマップされていても、必ずしもコードと重みが等しくない場合。
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: 0 mysql> 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.13「文字セットの追加」を参照してください。
Unicode マルチバイト文字セットの照合順序
これらの照合順序の一部は Unicode 照合順序アルゴリズム (UCA) に基づきますが、それ以外は基づいていません。
UCA に基づいていない照合順序では、文字コードと重みは 1 対 1 でマップしています。 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: 0
mysql> 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)
MySQL の UCA ベースの照合順序には、次の 3 つのプロパティーがあります。
文字に重みがある場合、それぞれの重みは 2 バイト (16 ビット) を使用します。
文字の重みはゼロ (または空の重み) の場合があります。 この場合、文字は無視できます。 例:「U+0000 NULL」は重みがなく、無視できます。
-
1 つの文字が 1 つの重みを持つ場合があります。 例:
'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)
-
1 つの文字が複数の重みを持つ場合があります。 これは拡張形式です。 例: ドイツ語の文字
'ß'
(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)
-
複数の文字が 1 つの重みを持つ場合があります。 これは短縮形式です。 例:
'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 ではサポートされていません。
UCA に基づいていない照合順序に関する実装の手順については、セクション10.13「文字セットの追加」を参照してください。 UCA 照合順序については、セクション10.14.4「Unicode 文字セットへの UCA 照合順序の追加」を参照してください。
その他の照合順序
上記のカテゴリのどれにも該当しない照合順序も少数存在します。