文字ストリング

文字ストリング は、一連のコード単位です。 ストリングの長さは、その一連のコード単位の数です。 長さがゼロの場合、その値は空ストリング と呼ばれます。この値を NULL 値と混同しないようにしてください。

固定長文字ストリング (CHAR)

固定長ストリングの列の値は、すべて同じ長さです。 この長さは、その列の長さ属性によって決定されます。 長さ属性は、1 から 255 までの範囲でなければなりません。 ただし、ストリング単位が CODEUNITS32(1 から 63 までの範囲) の場合は除きます。

可変長文字ストリング

可変長文字ストリングには、以下の 2 つのタイプがあります。
VARCHAR
VARCHAR 値は、最大 32,672 バイトまでの長さにすることができます。 ストリング単位が CODEUNITS32の場合、長さは最大 8,168 ストリング単位にすることができます。
CLOB
文字ラージ・オブジェクト (CLOB) 値は、最大 2 ギガバイトから 1 バイト (2,147,483,647 バイト) を引いた長さ (ストリング単位が CODEUNITS32の場合は、最大 536,870,911 ストリング単位)にすることができます。 CLOB は、(単一文字セットで記述された文書などの) ラージ SBCS、 または混合 (SBCS および MBCS) 文字ベース・データを保管するのに使用されます。したがって、 それに関連する SBCS または混合コード・ページがあります。
結果が CLOB データ・タイプとなる式、および構造化タイプ列に対して、特殊な制限が適用されます。そのような式および列は、以下の場所では使用できません。
  • DISTINCT 節が先行している SELECT リスト
  • GROUP BY 節
  • ORDER BY 文節
  • UNION ALL 以外のセット演算子の副選択
  • 基本述部、多値比較述部、BETWEEN 述部、または IN 述部
  • 集約関数
  • VARGRAPHIC、TRANSLATE、および日付/時刻スカラー関数
  • LIKE 述部のパターン・オペランドまたは POSSTR 関数の検索ストリング・オペランド
  • 日付/時刻値のストリング表記。

VARCHAR を引数として取る SYSFUN スキーマの関数は、 4,000 バイトよりも長い VARCHAR を引数として受け入れません。 しかし、そのような関数の多くには、 CLOB(1M) を受け入れるための代替シグニチャーが用意されています。 そのような代替シグニチャーが用意されている関数の場合は、 ユーザーが 4,000 バイトよりも長い VARCHAR ストリングを明示的に CLOB へキャストし、 結果が戻されたら任意の長さの VARCHAR へ再びキャストし直すという手順を取ります。

C の NULL 終了文字ストリングは、プリコンパイル・オプションの標準レベルに応じて、 異なった方式で処理されます。

それぞれの文字ストリングは、さらに次のいずれかと定義されます。
ビット・データ
コード・ページに対応していないデータ。
1 バイト文字セット (SBCS) データ
それぞれの文字が 1 バイトで表現されるデータ。
混合データ
1 バイト文字セットとマルチバイト文字セット (MBCS) の文字の混合を納めたデータ。
Unicode データ
1 バイト以上で表現される文字が入っているデータ。 各 Unicode 文字ストリングは、UTF-8 を使用してエンコードされます。 UTF-8 を表す CCSID は 1208 です。
注: LONG VARCHAR データ・タイプは引き続きサポートされますが、非推奨であり、将来のリリースで除去される可能性があります。

文字ストリングのストリング単位指定

文字ストリング・データ・タイプの長さの単位は OCTETS または CODEUNITS32 です。 長さの単位で、データ長を決定する際に使用されるカウント方式が定義されます。
OCTETS
長さ属性の単位がバイトであることを示します。 この長さ単位は、すべての非 Unicode 文字ストリング・データ・タイプに適用されます。 Unicode 文字ストリング・データ・タイプの場合は、環境設定に基づいて、OCTETS を明示的に指定または決定することができます。
CODEUNITS32
長さ属性の単位が、文字単位でカウントを概算する Unicode UTF-32 コード単位であることを示します。 この長さの単位は、データ・タイプの基礎となるコード・ページには影響しません。 データ値の実際の長さは、データが UTF-32 に変換された場合と同じように、UTF-32 コード単位をカウントして決定されます。 CODEUNITS32 のストリング単位は、 Unicode 文字ストリング・データ・タイプの場合にのみ使用できます。 CODEUNITS32 は、環境設定に基づいて、明示的に指定または決定することができます。

非 Unicode 文字ストリング・データ・タイプの場合、ストリング単位は常に OCTETS であり、変更することはできません。 Unicode 文字ストリング・データ・タイプの場合は、ストリング単位を文字ストリング・データ・タイプの長さ属性で明示的に指定することも、環境設定に基づいてデフォルトに設定することもできます。 文字ストリング・データ・タイプに FOR BIT DATA も指定されている場合は、 CODEUNITS32 を指定することはできず、CODEUNITS32 の環境設定は適用されません。

ストリング単位の環境設定は、NLS_STRING_UNITS グローバル変数の値、または string_units データベース構成パラメーターに基づきます。 データベース構成パラメーターを SYSTEM または CODEUNITS32 に設定することができます。 グローバル変数も SYSTEM または CODEUNITS32 に設定できますが、NULL に設定することもできます。 NULL 値は、SQL セッションで string_units データベース構成パラメーター設定を使用する必要があることを示します。 環境設定の値が SYSTEM である場合は、デフォルトのストリング単位設定として OCTETS が使用されます。

組み込み関数内のストリング単位

特定の組み込みストリング関数に対してストリング単位を指定する機能を使用して、「バイト・ベース方式」ではなく、「文字ベース方式」でストリング・データを処理することができます。 ストリング単位 によって、関数実行時の長さまたは位置に使用される単位が決まります。 一部のストリング関数のストリング単位として、CODEUNITS16、CODEUNITS32、または OCTETS を指定することができます。 ストリング単位が指定されていない場合は、通常、デフォルトのストリング単位はソース・ストリング引数のストリング単位で決まります (詳しくは、使用する関数の説明を参照してください)。 ストリング単位の引数は、Unicode データベースまたは非 Unicode データベースのパラメーターをサポートするストリング関数に対して指定できます。

CODEUNITS16
Unicode UTF-16 を操作の単位に指定します。 CODEUNITS16 が便利なのは、幅が 2 バイトのコード単位のデータをアプリケーションで処理する場合です。 補足文字 と呼ばれる一部の文字では、UTF-16 コード単位をエンコードする必要があることに注意してください。 例えば、音楽のト音記号の場合、2 つの UTF-16 コード単位 (UTF-16BE の X'D834' および X'DD1E') が必要です。
CODEUNITS32
Unicode UTF-32 を操作の単位に指定します。 CODEUNITS32 が便利なのは、単純な固定長の形式のデータを処理し、データの保管形式 (ASCII、UTF-8、または UTF-16) に関係なく同じ応答を戻す必要のあるアプリケーションの場合です。
注: ディスク上のストレージは、 UTF-8 エンコードを使用します。
OCTETS
バイトを操作の単位に指定します。 アプリケーションがバッファー・スペースを割り振ろうとしている場合や、単純なバイト処理を操作で使用する必要のある場合に、OCTETS が使用されることがよくあります。

OCTETS (バイト数) を使用して計算したストリングの算出長は、CODEUNITS16 または CODEUNITS32 を使用して計算したものとは異なることがあります。 OCTETS を使用した場合、ストリングの長さは、単純にストリング中のバイト数をカウントして判別されます。 CODEUNITS16 または CODEUNITS32 を使用した場合、ストリングの長さは、UTF-16 または UTF-32 でストリングを表すのに必要な 16 ビットまたは 32 ビットのコード単位の数をカウントして判別されます。 CODEUNITS16 と CODEUNITS32 を使用して決定される長さは、データに補足文字 ( CODEUNITS16 と CODEUNITS32 の違いを参照)が含まれていない限り、同一です。

例えば、Unicode UTF-8 でエンコードされた VARCHAR(128) 列である NAME の中に、値 'Jürgen' が入っていると想定します。 CODEUNITS16 または CODEUNITS32 でストリングの長さをカウントする以下の 2 つの照会は、同じ値 (6) を戻します。
   SELECT CHARACTER_LENGTH(NAME,CODEUNITS16) FROM T1
     WHERE NAME = 'Jürgen'

   SELECT CHARACTER_LENGTH(NAME,CODEUNITS32) FROM T1
     WHERE NAME = 'Jürgen'
次の照会は、OCTETS でストリングの長さをカウントしますが、これは値 7 を戻します。
   SELECT CHARACTER_LENGTH(NAME,OCTETS) FROM T1
     WHERE NAME = 'Jürgen'
これらの値は、指定のストリング単位で表現されたストリングの長さを表しています。
以下の表は、名前 'Jürgen' を UTF-8、UTF-16BE (ビッグ・エンディアン)、および UTF-32BE (ビッグ・エンディアン) で表現したものです。
Format    Representation of the name 'Jürgen'
--------  --------------------------------------
UTF-8	  X'4AC3BC7267656E'
UTF-16BE 	X'004A00FC007200670065006E'
UTF-32BE 	X'0000004A000000FC0000007200000067000000650000006E'
文字 'ü' の表現方法は、次のように、3 つのストリング単位でそれぞれ異なります。
  • 文字 'ü' の UTF-8 表現は X'C3BC' です。
  • 文字 'ü' の UTF-16BE 表現は X'00FC' です。
  • 文字 'ü' の UTF-32BE 表現は X'000000FC' です。

組み込み関数でストリング単位を指定しても、関数の結果のデータ・タイプ、ストリング単位、またはコード・ページには影響を与えません。 CODEUNITS16 または CODEUNITS32 を指定すると、必要に応じて、評価の目的でデータが Unicode に変換されます。

LOCATE 関数または POSITION 関数に対して OCTETS を指定した場合に、ストリング引数のコード・ページがそれぞれ異なっていると、データは source-string 引数のコード・ページに変換されます。 この場合、関数の結果は、source-string 引数のコード・ページのものになります。 単一のストリング引数をとる関数に対して OCTETS を指定した場合、データは、そのストリング引数のコード・ページで評価され、関数の結果は、そのストリング引数のコード・ページのものになります。

CODEUNITS16 と CODEUNITS32 の相違

CODEUNITS16 または CODEUNITS32 を指定すると、Unicode 補足文字がデータ中に入っていないかぎり、結果は同じになります。 その理由は、2 つの UTF-16 コード単位または 1 つの UTF-32 コード単位で補足文字が表されるからです。 UTF-8 では、非補足文字は 1 から 3 バイトまでで表され、補足文字は、4 バイトで表されます。 UTF-16 では、非補足文字は、1 つの CODEUNITS16 コード単位つまり 2 バイトで表され、補足文字は、2 つの CODEUNITS16 コード単位つまり 4 バイトで表されます。 UTF-32では、文字は 1 つの CODEUNITS32 コード単位または 4 バイトで表されます。

例えば、以下の表は、数学で使用される太字の大文字 A とローマ字の大文字 A の 16 進値を示しています。 数学で使用される太字の大文字 A は、UTF-8、UTF-16、および UTF-32の 4 バイトで表される補足文字です。
文字 UTF-8 で表現した場合 UTF-16BE で表現した場合 UTF-32BE で表現した場合
Unicode 値 X'1D400' - 'A'。数学の太字の大文字 A X'F09D9080' X'D835DC00' X'0001D400'
Unicode 値 X'0041' - 'A'。ローマ字の大文字 A。 X'41' X'0041' X'00000041 '
C1 は Unicode UTF-8 でエンコードされた VARCHAR(128) の列であり、表 T1 には 1 つの行が入っていて、これに数学の太字の大文字 A (X'F09D9080') の値が入っているものとします。 以下の照会は、それぞれ異なる結果を戻します。
Query                                                Returns
-----                                                -------
SELECT CHARACTER_LENGTH(C1,CODEUNITS16) FROM T1      2

SELECT CHARACTER_LENGTH(C1,CODEUNITS32) FROM T1      1

SELECT CHARACTER_LENGTH(C1,OCTETS) FROM T1           4