« 日付・時刻型の憂鬱 | トップページ | そしてLOB型 »

2007年10月21日 (日)

文字列型の憂鬱

先に日付・時刻型の事を書いたが、日付・時刻型より頻繁に使われるであろう文字列型も悩ましいのである。ODBCでは文字列を表すSQLデータ型として、

  • SQL_CHAR(SQL_WCHAR)
  • SQL_VARCHAR(SQL_WVARCHAR)
  • SQL_LONGVARCHAR(SQL_WVARCHAR)

が用意されている。これらに対応するアプリケーション側のCデータ型としてSQL_C_CHARがある。日付・時刻型と違い専用の構造体は用意されておらず、CやC++で文字列を扱う時と同様に、char *として扱う。括弧内はUnicode文字バージョンのSQLデータ型である。

名前を見れば分かるように、SQL_CHARは固定長の文字列、SQL_VARCHARは可変長の文字列、SQL_LONGVARCHARはより長い可変長の文字列を表すSQLデータ型で、ドライバ依存だが、DB2 CLIでは、DB2のCHAR型はSQL_CHAR、VARCHAR型はSQL_VARCHAR、LONG VARCHAR型はSQL_LONGVARCHAR、CLOB型はSQL_CLOBとして報告される。データベースのデータ型をODBCのどのSQLデータ型にマップするかは、ドライバ依存で、バイト数もしくは文字数がN以上ならSQL_LONGVARCHARにマップしなければいけないとかそのような規則はMicrosoftのODBCのヘルプを見る限りなさそうである。が、慣習的にLOB型などの非常に大きなサイズを許可するデータ型は、ほとんどのODBCドライバはLONGが付くSQL_LONGVARCHARなどにマップするようである。もしくは、DB2 CLIのように独自のSQLデータ型に(LOBの場合、SQL_CLOB、SQL_BLOB、SQL_DBLOB)。

悩ましいのここからで、列のデータを取り出すのに割り当てるメモリのサイズをどうすればいいかで頭を痛める。

例えば、可変長のデータ型に限ったことではないが、SQL_VARCHARのSQLデータ型として報告される列を取り出す場合を考える。SQL文をユーザーが発行できるツールなど汎用的なアプリの場合、事前に実際の列データのサイズを知ることはできないので、データの切り捨てが発生しないよう普通は列の情報を問い合わせたときに返される最大サイズ分のメモリ領域を割り当てる。想像通り、返される最大サイズが小さければいいが、2GBとか巨大なサイズが返されると・・しかも、可変長のデータ型の場合、最大サイズが巨大でも、実際に格納されている列データのサイズが小さいと、メモリの無駄である。

と色々悩ましいのである。ちなみに、DB2のCHAR、VARCHARやLONG VARCHAR型は定義できる最大サイズが約32KBなので、返される最大サイズ分のメモリを一度に割り当てて列データを取り出しても問題ないとは思う。DB2で問題なのは最大サイズが約2GBのCLOB型などのLOB型のデータ型である。

これらのDB2のデータ型に対して、DB2 CLIはLOBデータを操作するためにLOBロケータというものを用意しアプリケーション側から効率的にLOBデータにアクセスできるようになっている(他のデータベースにもあるが)。LOBロケータとしてマップするためのDB2 CLI独自のCデータ型として

  • SQL_C_CLOB_LOCATOR
  • SQL_C_BLOB_LOCATOR
  • SQL_C_DBLOB_LOCATOR

が用意され、これらのC言語における定義はSQLINTEGERつまり4バイトの整数値となっている。

つまり、アプリケーション側が見れば、LOBロケータはそれらを識別する単なる4バイトの整数値として扱え、LOBデータを取り出す時に、とりあえず、LOBロケータを格納する4バイトのメモリ領域だけ割り当て、そこにLOBロケータを取り出し、実際にそのLOBロケータによって参照されるLOBデータを取り出す必要がある時に、最大のサイズではなく実際のLOBデータのサイズだけを返すDB2 CLI専用の関数を呼び、必要最小限のメモリだけを割り当てて取り出すことができる(もちろん、分割して取り出すこともできる)。実際のLOBデータが巨大だったら、まぁ、どうにかしないといけないが・・・・

また、ODBCには大きなサイズのデータを扱うための仕組みが用意され、それを使うこともできるが、専用の関数を使った方がプログラム的には楽である(と思う・・)。

« 日付・時刻型の憂鬱 | トップページ | そしてLOB型 »

DB2」カテゴリの記事

Oracle」カテゴリの記事

データベース」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1497665/39651817

この記事へのトラックバック一覧です: 文字列型の憂鬱:

« 日付・時刻型の憂鬱 | トップページ | そしてLOB型 »

自作ソフトウェア

無料ブログはココログ

メモ