文字変換

ストリング は、文字を表す一連のバイトです。 1 つのストリングの中では、すべての文字が共通のコード表示で表されます。 これらの文字を別のコード表示に変換しなければならない場合があります。この変換プロセスは、文字変換 と呼ばれます。

SQL ステートメントをリモート側で実行するときに、文字変換が行われることがあります。1例えば、次の 2 つの場合を考えてみます。

上記のどちらの場合も、送信側と受信側のシステムでストリングの表現が異なる可能性があります。同一のシステムにおけるストリング操作でも、変換が行われる場合があります。

SQL ステートメントはストリングであるため、ステートメントが文字変換の影響を 受けることに注意してください。

以下のリストは、文字変換の説明で使用される用語のいくつかを定義しています。

文字セット
定義された文字の集合。例えば、次のような文字セットを持つコード・ページがあります。
  • A から Z までのアクセントなしの文字 (26 文字)
  • a から z までのアクセントなしの文字 (26 文字)
  • 0 から 9 までの数字
  • . , : ; ? ( ) ' " / - _ & + = < >
コード・ページ
コード・ポイントに対して文字を割り当てた集合。 例えば、EBCDIC では、「A」にはコード・ポイント X'C1' が割り当てられ、「B」にはコード・ポイント X'C2' が割り当てられます。 1 つのコード・ページ内では、それぞれのコード・ポイントが特定の意味を 1 つだけ持ちます。
コード・ポイント
コード・ページ内の文字を表す固有のビット・パターン。
コード化文字セット
文字セットを確立するとともに、セット内の文字とそのコード表示との間に 1 対 1 の関係を確立する明確な規則の集合。
エンコード・スキーム
文字データを表現するために使用する規則の集合。例えば次のようなものがあります。
  • 1 バイト EBCDIC
  • 1 バイト ASCII
  • 2 バイト EBCDIC
  • 1 バイト ASCII および 2 バイト ASCII 混合の 2
  • Unicode (UTF-8、UCS-2、および UTF-16 汎用コード化文字セット)。
置換文字
文字変換で、ソースのコード表示の文字に対応する文字が、ターゲットの コード表示に存在しない場合に、その文字に置き換わる固有の文字。
Unicode
書き記された文字やテキストのデータを国際的に交換できるように定められた、汎用コード化体系。 Unicode には、全世界で使用可能な文字セットの標準が規定されています。 16 ビット・エンコード方式が採用されており、65,000 を超える文字のコード・ポイント、 およびさらに 100 万文字もエンコードを可能にする UTF-16 と呼ばれる拡張セットが提供されています。 また Unicode は文字ごとに数値と名前を指定しているため、 世界の文字言語に使用されるすべての文字をエンコードできるだけでなく、 英字、漢字、および記号を等しく扱うことができます。 扱える文字には、句読記号、数学記号、技術記号、幾何学形状、および飾り活字が含まれます。 以下の 3 つのタイプのエンコード方式がサポートされています。
  • UTF-8: Unicode Transformation Format、8 ビット・エンコード方式。 既存の ASCII ベースのシステムで簡単に利用できるように設計されたもの。 UTF-8 データは、文字データ・タイプで保管されます。 UTF-8 形式のデータの CCSID 値は 1208 です。

    UTF-8 文字の長さは、1、2、3、または 4 バイトのいずれかにすることもできます。 UTF-8 データ・ストリングには、サロゲートや合成文字を含め、 SBCS および DBCS データを任意に組み合わせて含めることができます。

  • UCS-2: 2 つのオクテットでコード化された汎用文字セット。 1 文字が 16 ビットで表現されることを意味します。 UCS-2 データは、グラフィック・データ・タイプで保管されます。 UCS-2 形式のデータの CCSID 値は 13488 です。

    UCS-2 は UTF-16 のサブセットです。 UTF-16 が合成文字やサロゲートをサポートしていることを除けば、UCS-2 と UTF-16 は同一です。 UCS-2 は UTF-16 を単純化したものであるため、 UTF-16 データに比べて UCS-2 データの方が操作性に優れています。 3

  • UTF-16: Unicode Transformation Format、16 ビット・エンコード方式。 100 万を超える文字のコード値を提供できるように設計されたもの。 UTF-16 データは、グラフィック・データ・タイプで保管されます。 UTF-16 形式のデータの CCSID 値は 1200 です。

    UTF-8 データと UTF-16 データにはともに合成文字 が含まれています。 合成文字サポートにより、1 つ以上の文字を組み合わせて 1 文字にすることが可能です。 データ・ストリングとして、1 文字目の後に、 何百文字もの異なる非スペーシング・アクセント文字 (ウムラウト、アクサンなど) を続けることができます。 複数の文字を組み合わせてできた文字は、既に文字セットに定義されている場合があります。 その場合には、同じ文字に複数の表現方法があるということになります。 例えば、UTF-16 では、é が X'00E9' (正規化された表現) または X'00650301' (正規化されていない合成文字表現) のいずれかで表現できます。

    同じ文字の複数の表現を等しく比較することはできないので、 データベース内に両方の文字形式を保管するのは賢明ではありません。正規化 とは、合成文字のストリングを合成文字を含まない同等の文字で置き換える処理のことです。 正規化が行われると、データに存在する特定の文字の表現形式は 1 つになります。 例えば、UTF-16 では、X'00650301' (é の正規化されていない合成文字表現) が X'00E9' (é の正規化された表現) に変換されます。4

    述部の中で UTF-8 を適正に取り扱うために、正規化が行われることがあります。

    UTF-8 と UTF-16 の両方にはサロゲート と呼ばれる 4 バイト文字を含めることができます。 サロゲートとは、2 バイト文字セットで利用できる文字数よりさらに 100 万多い 文字数を当てられるようにした 4 バイト・シーケンスです。

1 文字変換が必要な場合、変換は自動的に行われ、正常に変換された場合は、アプリケーションは変換が行われたことを認識しません。 したがって、ステートメントの実行に関連するすべてのストリングが同一の方法で表現されている場合には、変換の知識は必要ありません。したがって、多くの読者の場合、文字変換の知識は必要ないはずです。
2 UTF-8 Unicode データも混合データです。 しかし本書では、混合 1 バイトおよび 2 バイト・データを指して「混合データ」と呼んでいます。
3 UCS-2 を使ってサロゲートや合成文字を表すこともできますが、 それらの文字はその通りには認識されません。 16 ビットごとに 1 文字として認識されてしまいます。
4 正規化がパフォーマンスに与える影響は大きいので (CPU に 2.5 から 25 % の余分な負荷がかかります)、列定義のデフォルトは NOT NORMALIZED です。