Db2 によるストリングの長さの計算方法の指定

特定の長さ関数を使用する場合は、Db2 に長さをバイトまたは文字数で計算するかどうかを指定できます。 この区別は、マルチバイト文字に対して重要です。 Db2 データを Unicode に変換し、データが拡張された場合は、これらの関数呼び出しの一部を更新して、適切な測定単位を指定することを検討してください。

例えば、UTF-8 の文字列 Jürgen を考えてみます。 このストリングは、6 文字で構成されます。 しかし、 文字ü は UTF-8 で2バイトを必要とするため、7バイトの記憶領域を必要とします。 Db2 で、長さを 6 または 7 としてカウントするかどうかを指定できます。

重要なのは、長さを計算するときに Db2 が使用するサイズ・コード単位を指定することです。 コード単位は、文字を表現できる最小のビットの組み合わせです。

プロシージャー

Db2 によるストリング長の計算方法を指定するには:

以下のいずれかの長さ関数を使用する場合、適切な単位を指定します。

汎用プログラミングインターフェース情報の開始。適用可能な関数:

  • CHARACTER_LENGTH
  • CLOB
  • DBCLOB
  • GRAPHIC
  • LEFT
  • LOCATE
  • LOCATE_IN_STRING
  • OVERLAY
  • POSITION
  • RIGHT
  • SUBSTRING
  • VARCHAR
  • VARGRAPHIC
汎用プログラミングインターフェース情報の終了。

単位指定のオプション

CODEUNITS16
Db2 が、16 ビット (または 2 バイト) のコード単位で長さを数えることを指定します。 文字列内の 2 バイト以下の文字ごとに、Db2 は長さ 1 を数えます。
CODEUNITS32
Db2 が、32 ビット (または 4 バイト) のコード単位で長さを数えることを指定します。 文字列内の 4 バイト以下の文字ごとに、Db2 は長さ 1 を数えます。 補助文字がない限り、CODEUNITS32 は常に CODEUNITS16 と同じ値を返します。
OCTETS
Db2 がバイト単位で長さを数えることを指定します。 文字列内のバイトごとに、Db2 は長さ 1 を数えます。

OCTETS オプションは、リストされているすべての関数に対しては使用できません。

汎用プログラミングインターフェース情報の開始。
例: CHARACTER_LENGTH
NAME は Unicode UTF-8 でエンコードされ、「Jürgen」を含む VARCHAR(128) 列であるとします。 UTF-8 では、üという文字は 2バイト必要です。

Db2 は文字列 Jürgen を 6 文字と数えるので、以下の 2 つの照会は両方とも値 6 を返します。 最初の照会では、CODEUNITS32 は 4 バイト以下の任意の文字を 1 と数えることを意味します。 2 番目の照会では、CODEUNITS16 は 2 バイト以下の任意の文字を 1 と数えることを意味します。 どちらの場合も、結果は同じです。

SELECT CHARACTER_LENGTH(NAME,CODEUNITS32)
		FROM T1 WHERE NAME = 'Jürgen';
SELECT CHARACTER_LENGTH(NAME,CODEUNITS16)
		FROM T1 WHERE NAME = 'Jürgen';
ただし、以下の 2 つの照会では、ストリングに 7 バイト含まれているため、値 7 が返されます。 1 番目の照会では、OCTETS により、長さはバイト単位で計算されます。 2 番目の照会では、LENGTH 関数により、常にバイト単位で数えられます。
SELECT CHARACTER_LENGTH(NAME,OCTETS)
		FROM T1 WHERE NAME = 'Jürgen';
SELECT LENGTH(NAME)
		FROM T1 WHERE NAME = 'Jürgen';
例: LOCATE_IN_STRING
LOCATE_IN_STRING 関数は、指定のストリング内で引数が現れた開始位置を戻します。 この関数は POSITION に類似していますが、検出する検索ストリングのインスタンスを指定するために、パラメーターが追加されています。 次のステートメントは、文字列内の 26th 文字がß であるため、ホスト変数POSITIONの値を26に設定します。 この場合、CODEUNITS32 により、4 バイト以下の文字が 1 と数えられます。
SET :POSITION = LOCATE_IN_STRING('Jürgen lives on Hegelstraße','ß',-1,CODEUNITS32);
-- search from end
次のステートメントは、ホスト変数POSITIONの値を6に設定します。 Db2 位置1から始まり、文字Nの3番目の出現箇所を探します。 この場合、OCTETS は Db2 が長さをバイト単位で数えることを意味します。
SET :POSITION = LOCATE_IN_STRING('WINNING','N',1,3,OCTETS);
他の長さ関数の例
以下の表に、CODEUNITS16、CODEUNITS32、および OCTET オプションの例を示します。
表 1. 長さ関数の例
関数 結果 16 進数の結果値
LEFT(‘Jürgen',2,CODEUNITS32)
'Jü'
X'4AC3BC'
LEFT(‘Jürgen',2,CODEUNITS16)
'Jü'
X'4AC3BC'
LEFT(‘Jürgen',2,OCTETS) 
'J '  
X'4A20' (切り捨て済みストリング)
LEFT(‘Jürgen',2) 
'J?'
X'4AC3' (文字「J」および部分文字)1
RIGHT(‘Jürgen',5,CODEUNITS32)
'ürgen'
X'C3BC7267656E'
RIGHT(‘Jürgen',5,CODEUNITS16) 
'ürgen'
X'C3BC7267656E'
RIGHT(‘Jürgen',5,OCTETS) 
'rgen'
X'207267656E' (切り捨て済みストリング)
RIGHT(‘Jürgen',5) 
'?rgen'
X'BC7267656E' (「rgen」の後に続く部分文字)1
SUBSTRING(‘Jürgen',1,2,CODEUNITS32) 
'Jü'
X'4AC3BC'
SUBSTRING(‘Jürgen',1,2,CODEUNITS16)
'Jü'
X'4AC3BC'
SUBSTRING(‘Jürgen',1,2,OCTETS)
'J ' 
X'4A20' (切り捨て済みストリング)
SUBSTR(‘Jürgen',1,2) 
‘J?'
X'4AC3' (部分文字)
SUBSTRING(‘Jürgen',8,CODEUNITS16) 
''
ゼロ長のストリング
SUBSTRING(‘Jürgen',8,4,OCTETS) 
''
ゼロ長のストリング
  1. ストリングで部分文字に関する変換が発生した場合、結果は SQLCODE -330 です。
 
汎用プログラミングインターフェース情報の終了。