パラメータマーカーに指定する文字列が長すぎるとSQLエラー(続き)
パラメータマーカーに指定する文字列が長すぎるとSQLエラー - HHeLiBeXの日記 正道編
これを受けて、「じゃあどうするべきなのか」という話を書こうとしたんだけど、眠くて力尽きたというか(ごにょごにょ)。
DB2はPREPAREする時点でパラメーターマーカーの型を評価している
油断(何)している間にトラバもしていただいているので、コレも踏まえて考えてみる。
実は、1時間ほどかけていろいろ考えて書いていたのだが、保存前に吹っ飛んでしまい、別の意味で再度力尽きたという‥そんなわけでかなりざっくりモード(何)に‥
実際に渡すデータのデータサイズの方が列のデータサイズよりも大きい場合の対処として、
これをエラー無く動作させたい場合は?に11バイト以上入る型を与えれば良いわけです。SQLで型を指定するにはCASTを使用します。つまりPREPAREの時点で
> SELECT ID, NAME FROM HOGE WHERE NAME = CAST(? AS VARCHAR(100))
等とするとエラー無く動作します。
DB2はPREPAREする時点でパラメーターマーカーの型を評価している
というのが考えられる。
これには2つの問題が潜んでいると考える。
- VARCHAR(100)の"100"はどこからくるのか
- さまざまなDBMSで共通のSQLクエリを使用しようとした場合に、MySQLでは上記のCASTが文法エラーになる。
- まぁ、これは、複雑なクエリを書く場合にはどっちみちDBMSごとにクエリを書かなければならないことを考えると、そう大きな問題ではないかもしれない。
ちなみに、
こういった型への厳密さは他RDBMSからの移植の妨げになり得たのですが、DB2 9.7では"緩い型付け"モードが追加されて上記のような他RDBMSとの非互換が起こりにくくなっています。(DB2 9.7で上記がCAST無しで通るのかは確認できていないです)
DB2はPREPAREする時点でパラメーターマーカーの型を評価している
について、とりあえずDB2 9.5と同じCREATE DATABASE文、CREATE TABLE文で生成したデータベースで調べてみたが、状況は変わらなかった。
"緩い型付け"モードに関する情報をまだ見つけられていないので、それはこれから。