HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

パラメータマーカーに指定する文字列が長すぎるとSQLエラー(続き)

パラメータマーカーに指定する文字列が長すぎるとSQLエラー - HHeLiBeXの日記 正道編
これを受けて、「じゃあどうするべきなのか」という話を書こうとしたんだけど、眠くて力尽きたというか(ごにょごにょ)。
DB2はPREPAREする時点でパラメーターマーカーの型を評価している
油断(何)している間にトラバもしていただいているので、コレも踏まえて考えてみる。

実は、1時間ほどかけていろいろ考えて書いていたのだが、保存前に吹っ飛んでしまい、別の意味で再度力尽きたという‥そんなわけでかなりざっくりモード(何)に‥
実際に渡すデータのデータサイズの方が列のデータサイズよりも大きい場合の対処として、

これをエラー無く動作させたい場合は?に11バイト以上入る型を与えれば良いわけです。SQLで型を指定するにはCASTを使用します。つまりPREPAREの時点で

> SELECT ID, NAME FROM HOGE WHERE NAME = CAST(? AS VARCHAR(100))

等とするとエラー無く動作します。

DB2はPREPAREする時点でパラメーターマーカーの型を評価している

というのが考えられる。
これには2つの問題が潜んでいると考える。

  1. VARCHAR(100)の"100"はどこからくるのか
    • "100"はバイト数だが、例えばJavaのString#length()は文字列の長さ(サロゲートペアを考えなければ文字数と等価)。なので、バイト数を知るためにはDB側で使用される文字エンコーディングを知らなければならないというもうひとつの問題が顔を出す。常にVARCHARに指定可能な最大サイズを書いてしまうという荒業に問題がないのならそれでもいいのだろうけど‥
  2. さまざまなDBMSで共通のSQLクエリを使用しようとした場合に、MySQLでは上記のCASTが文法エラーになる。
    • まぁ、これは、複雑なクエリを書く場合にはどっちみちDBMSごとにクエリを書かなければならないことを考えると、そう大きな問題ではないかもしれない。

ちなみに、

こういった型への厳密さは他RDBMSからの移植の妨げになり得たのですが、DB2 9.7では"緩い型付け"モードが追加されて上記のような他RDBMSとの非互換が起こりにくくなっています。(DB2 9.7で上記がCAST無しで通るのかは確認できていないです)

DB2はPREPAREする時点でパラメーターマーカーの型を評価している

について、とりあえずDB2 9.5と同じCREATE DATABASE文、CREATE TABLE文で生成したデータベースで調べてみたが、状況は変わらなかった。
"緩い型付け"モードに関する情報をまだ見つけられていないので、それはこれから。