言語対応型照合

言語認識照合は、 Db2® データベースが非 Unicode データベース用に使用する重み表に基づいています。 この重み表が Unicode に変換され、Unicode データに適用されます。

ストリングは、各文字に対して Unicode 文字のサブセットから単一の重みが提供されて順序付けされます。 この重み表は、Db2 データベースの非 Unicode 照合表に由来しています。 重み表にない文字は、バイナリー順にソートされます。 結果として、各単語は言語上正しい順序に近い形でソートされます。

ストリングの内部表記を使用して、サブストリング・マッチングが行われます。 これにより、2 つのサブストリングがバイト単位で同一の場合のみ、一致していると見なされ、言語上の規則は考慮されません。

言語認識照合で使用される文字の重みについて詳しくは、 システムおよび言語認識照合表を参照してください。

利点
  • 重み表のコード・ポイントの言語ベースの順序付けを使用します。
  • 照合がとても高速です (非 Unicode の照合および IDENTITY 照合と比較して)。
  • 文字タイプとグラフィック・タイプの順序付けが同じです。 1
  • 非 Unicode データベースから Unicode データベースへのマイグレーションで、照合が変更されることはありません。

1 文字ストリングでは、x'EE8080' から x'EFBFBF' (両端を含む)(U+E000 から U+FFFF) の範囲の文字は、x'F0908080' から x'F48FBFBF' (U+10000 から U+10FFFF) の補足文字の後にソートされます。 しかし特定のプラットフォームでは、x'EE8080' から x'EFBFBF' までの範囲の文字の前に、補助文字がソートされます。 影響を受けるプラットフォームは、 Linux® AMD 64、 HP-UX IA64、SUN SPARC64、SUN AMD x64です。

影響を受ける全プラットフォームにおいて、アプリケーションは、order by 節の前で文字ストリングをグラフィック・ストリングとしてキャストすることで、グラフィック・ストリングとしてのソート順を得られます。

以下に例を示します。

db2 "create db utf using codeset UTF-8 collate using  SYSTEM_819_US"
db2 "connect to utf"
db2 "create table t2 ( c1 int, c2 varchar(200),c3 vargraphic(200))"
db2 "insert into t2 values (1, U&'\E000', U&'\E000' )"
db2 "insert into t2 values (2, U&'\FFFF', U&'\FFFF' )"
db2 "insert into t2 values (3, U&'\+10FFFE', U&'\+10FFFE' )"
db2 "insert into t2 values (4, U&'\+10FFFF', U&'\+10FFFF' )"
db2 "select hex(c2) from t2 order by c2"

前述の照会による、文字列 c2 の正しいソート順の結果は、次のとおりです。

  • F48FBFBE
  • F48FBFBF
  • EE8080
  • EFBFBF

影響を受けるプラットフォームにおける逆のソート順は、次のとおりです。

  • EE8080
  • EFBFBF
  • F48FBFBE
  • F48FBFBF

グラフィックとしてのソート順を得るための回避策は、次のとおりです。

db2 'select hex(c2) from t2 order by graphic (c2)'
  • F48FBFBE
  • F48FBFBF
  • EE8080
  • EFBFBF
欠点
  • 重み表の 256 コード・ポイントだけが扱われます。 他のコード・ポイントはバイナリー順にソートされます。
  • 元の非 Unicode 重み表は MBCS 文字を適切に処理しませんでした。 その表が Unicode に移動されると、各表の SBCS 部分だけが使用されました。
  • こうした照合は、結合アクセントを処理しません。
  • サブストリング・マッチングは言語を考慮に入れません。

言語対応型照合が適しているのは、適度な順序付けが必要とされるものの、ロケールに依存する UCA ベースの照合に必要な追加処理は許容できないという場合です。

この照合の動作を例証するために、以下のチェコ語のリストを使用します。
  • chleb1
  • チェコ
  • Cモン・サービス・サービス 2
  • Jana
  • hlava
  • Jaroslav
  • holub
  • cena
  • jaro
  • チャス
  • c例: 3

言語認識照合を使用するデータベースは、コマンド CREATE DATABASE TESTDB COLLATE USING SYSTEM_912_CZを使用して作成されました。

ソート:
SELECT WORD FROM TESTDATA ORDER BY WORD

WORD
----------
cena
chleb
c◌̌as
C◌̌ech
čas
Čech
hlava
holub
jaro
Jana
Jaroslav
ORDER BY コマンドの結果で、以下の点に注目してください。
  • 大文字、小文字、およびアクセント付き文字は、相互にグループ化されています。
  • 結合アクセントが付いている文字は、アクセントが付いていない文字とともにグループ化されています。
  • 大/小文字およびアクセントの違いは意味があるものとして扱われています。 例えば、JanajaroJaroslav の間に順序付けされています。
  • chleb という単語は、文字 c で始める他の単語とともに間違ってグループ化されています。
サブストリング・マッチング:
SELECT WORD FROM TESTDATA WHERE WORD LIKE 'c%'

WORD 
---------- 
cena 
chleb 
c◌̌as
LIKE コマンドの結果で、以下の点に注目してください。
  • 先頭が cではないにもかかわらず、 cいくらでも という単語が選択されています。 これは文字 リッチ で始まります。
  • chleb という単語では、連字 ch は文字 c と言語的には一致しませんが選択されています。
1 チェコ語では、 ch は文字 c とは別にソートされ、文字 hiの間で配列されます。
2 Unicode では、アクセント付き文字 は、単一の Unicode コード・ポイント U+010C (Latin capital letter C with caron) または 2 つのコード・ポイント U+0043 U+030C (Latin capital letter C, 結合 caron) として入力できます。 これら 2 つの表記はコンピューター画面または印刷出力では同じに見えますが、内部表記は異なります。 ただし、これらの例では、文字の描画方法が異なります。 U+010C は として描画され、 U+0043 U+030C は Cnode として描画されます。 結合アクセントを示すために、両方の形式が単語リストに含まれています。
3 Unicode では、アクセント付き文字 リッチ は、単一の Unicode コード・ポイント U+010D (Latin small letter c with caron) または 2 つのコード・ポイント U+0063 U+030C (Latin small letter c、結合 caron) として入力できます。 これら 2 つの表記はコンピューター画面または印刷出力では同じに見えますが、内部表記は異なります。 ただし、これらの例では、文字のドロー方法が異なります。 U+010D は としてドローされ、 U+0063 U+030C は cnode としてドローされます。 結合アクセントを示すために、両方の形式が単語リストに含まれています。