Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


10.4.1 照合順序の実装タイプ

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.4.3「8 ビットの文字セットへの単純な照合順序の追加」を参照してください。

8 ビット文字セットに対する複雑な照合順序

この種の照合順序は、セクション10.3「文字セットの追加」で説明しているように、文字を順序付けする方法を定義した 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.3「文字セットの追加」を参照してください。

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.3「文字セットの追加」を参照してください。UCA 照合順序については、セクション10.4.4「Unicode 文字セットへの UCA 照合順序の追加」を参照してください。

その他の照合順序

上記のカテゴリのどれにも該当しない照合順序も少数存在します。


User Comments
Sign Up Login You must be logged in to post a comment.