MySQLは複数のタイプの照合順序を実装します。
8ビットの文字セットに対する単純な照合順序
この種の照合順序は,文字コードと重みの対1のマッピングを定義した256個の重みの配列を使用して実装されます。latin1_swedish_ci
がその一例です。これは,大文字と小文字を区別しない照合順序なので,大文字と小文字は同じ重みで,等しいものと見なされます。
mysql> SET NAMES 'latin1' COLLATE 'latin1_swedish_ci';SELECT HEX(WEIGHT_STRING('a')), HEX(WEIGHT_STRING('a'))+-------------------------+-------------------------+ | 十六进制(WEIGHT_STRING (' a ')) |十六进制(WEIGHT_STRING(“ ')) | +-------------------------+-------------------------+ | 41 | 41 | +-------------------------+-------------------------+ 1行组(0.01秒)mysql >选择' a ' = ' a ';+-----------+ | ' “=” ' | +-----------+ | 1 | +-----------+ 1行集(0.12秒)
実装の手順については,セクション10.4.3 " 8ビットの文字セットへの単純な照合順序の追加"を参照してください。
8ビット文字セットに対する複雑な照合順序
この種の照合順序は,セクション10.3“文字セットの追加”で説明しているように,文字を順序付けする方法を定義したCソースファイル内の関数を使用して実装されます。
Unicode以外のマルチバイト文字セットの照合順序
この種の照合順序では,8ビット(シングルバイト)文字とマルチバイト文字が異なる方法で処理されます。8ビットの文字の場合,文字コードは大文字と小文字を区別しない形式で重みにマップされます。(たとえば,シングルバイト文字“一个”
と“一个”
はどちらも重みが0 x41
です)マルチバイト文字の場合,文字コードと重みの間には,2種類の関係があります。
重みが文字コードと等しい場合。
sjis_japanese_ci
がこの種の照合順序の一例です。マルチバイト文字“ぢ”
の文字コードは0 x82c0
であり,重みも0 x82c0
です。创建表t1 -> (c1 VARCHAR(2) CHARACTER SET sjis)INSERT INTO t1 VALUES ('a'),(' a'),(0x82C0);查询3行影响(0.00秒)记录:3 duplicate: 0 Warnings: 0 mysql> SELECT c1, HEX(c1), HEX(c1)) FROM t1;+------+---------+------------------------+ | c1 |十六进制(c1) |十六进制(WEIGHT_STRING (c1 )) | +------+---------+------------------------+ | 41 | 61 | | | | 41 | 41 | |ぢc0 | 82 | 82 c0 | +------+---------+------------------------+ 3行集(0.00秒)
文字コードが1対1で重みにマップされていても,必ずしもコードと重みが等しくない場合。
gbk_chinese_ci
がこの種の照合順序の一例です。マルチバイト文字'膰'
の文字コードは0 x81b0
ですが,重みは0 xc286
です。创建表t1 -> (c1 VARCHAR(2) CHARACTER SET)INSERT INTO t1 VALUES ('a'),(' a'),(0x81B0);查询3行影响(0.00秒)记录:3 duplicate: 0 Warnings: 0 mysql> SELECT c1, HEX(c1), HEX(c1)) FROM t1;+------+---------+------------------------+ | c1 |十六进制(c1) |十六进制(WEIGHT_STRING (c1 )) | +------+---------+------------------------+ | 41 | 61 | | | | 41 | 41 | |膰b0 | 81 | C286 | +------+---------+------------------------+ 3行集(0.00秒)
実装の手順については,セクション10.3“文字セットの追加”を参照してください。
Unicodeマルチバイト文字セットの照合順序
これらの照合順序の一部はUnicode照合順序アルゴリズム(UCA)に基づきますが,それ以外は基づいていません。
Ucaに基づいていない照合順序では,文字コードと重みは1対1でマップしています。MySQLでは,このような照合順序は大文字と小文字を区別せず,アクセント,濁音,破裂音を区別しません。utf8_general_ci
がその一例です。“一个”
、“一个”
、“一个”
,および“一个”
のそれぞれは文字コードは別々ですが,重みはすべて0 x0041
であり,等しいものと見なされます。
mysql> SET NAMES 'utf8' COLLATE 'utf8_general_ci';创建表t1 -> (c1 CHAR(1) CHARACTER SET UTF8 COLLATE utf8_general_ci);INSERT INTO t1 VALUES ('a'),(' a'),(' À'),('á');SELECT c1, HEX(c1), HEX(c1)) FROM t1;+------+---------+------------------------+ | c1 |十六进制(c1) |十六进制(WEIGHT_STRING (c1 )) | +------+---------+------------------------+ | | 61 | 0041 | | 0041 | | 41 | |的| C380 | 0041 | |是| C3A1 | 0041年 | +------+---------+------------------------+ 4行集(0.00秒)
MySQLのUCAベースの照合順序には,次の3つのプロパティーがあります。
文字に重みがある場合,それぞれの重みは2バイト(16ビット)を使用します。
文字の重みはゼロ(または空の重み)の場合があります。この場合,文字は無視できます。例:「U+0000 NULL」は重みがなく、無視できます。
1つの文字が1つの重みを持つ場合があります。例:
“一个”
には0 x0e33
の重みがあります。mysql> SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';SELECT HEX('a'), HEX('a'));+----------+-------------------------+ | 十六进制(a) |十六进制(WEIGHT_STRING (' ')) | +----------+-------------------------+ | 61 | 0 e33 | +----------+-------------------------+ 1行集(0.02秒)
1つの文字が複数の重みを持つ場合があります。これは拡張形式です。例:ドイツ語の文字
“ß”
(szリガチャーまたはsharp s)には,0 x0fea0fea
の重みがあります。mysql> SET NAMES 'utf8' COLLATE 'utf8_unicode_ci';SELECT HEX('ß'), HEX(WEIGHT_STRING('ß'));+-----------+--------------------------+ | 十六进制(ß)|十六进制(WEIGHT_STRING(ß ')) | +-----------+--------------------------+ | C39F | 0 fea0fea | +-----------+--------------------------+ 1行集(0.00秒)
複数の文字が1つの重みを持つ場合があります。これは短縮形式です。例:
“ch”
は,チェコ語の単一の文字であり,0 x0ee2
の重みを持ちます。mysql> SET NAMES 'utf8' COLLATE 'utf8_czech_ci'SELECT HEX('ch'), HEX('ch'));+-----------+--------------------------+ | 十六进制(ch) |十六进制(WEIGHT_STRING (ch ')) | +-----------+--------------------------+ | 6368 | 0 ee2 | +-----------+--------------------------+ 1行集(0.00秒)
複数の文字と複数の重みのマッピングも可能です(これは拡張形式を使用した短縮形式です)が,MySQLではサポートされていません。
Ucaに基づいていない照合順序に関する実装の手順については,セクション10.3“文字セットの追加”を参照してください。Uca照合順序については,セクション10.4.4 " Unicode文字セットへのUCA照合順序の追加"を参照してください。
その他の照合順序
上記のカテゴリのどれにも該当しない照合順序も少数存在します。