2013年1月24日木曜日

sqlite.netのBOOLEAN型

sqlite.netを使ってプログラムを書いていてハマったのでメモメモ。

まず、sqlite自身にあまり細かい型が無い事は知ってました。そしてsqlite自身、それからsqlite.net側の処理として型が拡張されておりBOOLが使えるとの事なので試しにBOOL型(BOOLEAN型でもいけた)のところにTRUEを入れるSQLを書いてみる・・・入りました。 まぁ、文字列として入っているから当然なんですけど。で、、、C#で読み出してみると「false」が返ってきます。ヤッター!

なんでだろーっとソースコードを見てみると・・・テキストとして

「yes」「y」「1」「on」

trueとして

「no」「n」「0」「off」

falseとして処理されております・・・。

あれ?trueとかfalseは!?普通の感覚だとBOOLEANとか言われたらtrue/falseとかじゃないの!?

まぁ、その文字の判定の前に渡されたオブジェクトがbool型(C#的な)だったらboolとして処理するみたいな形になっているのでそれで満足してそれ以外の型で処理する様になっている様なのですが・・・そもそもsqliteにはbool型無いし、C言語(sqliteはCで書かれている)的にもbool無いしこの処理って意味あるのか!?

その前の処理までは追っていないのでそこで何やらやっている可能性もあるけど・・・まぁちゃんと値返ってきてないし無いわな。

<閑話休題>

ちょっと調べてみるとBoolean型自体はSQL的にはSQL:1999で定義されていてtrue/falseで処理出来る様です。なのでSQL的には間違った物ではないのですがsqlite3のドキュメントを読むと・・・「SQL92に一応準拠」との事。

まー、じゃあしょうがないよな・・・?

しょうがないよな!?

いや、やっぱりyes/noとか処理してるんだしsqlite.netでtrue/falseの判定すべきだろう。

まぁ世間一般的にSQLの世界としては規格化されていてもブッチしている実装はいっぱいあるわけで、BOOLEANもあまりサポートされていない存在らしいので深く考えずに数値型に0/1入れて処理しておくのが幸せになれる方法なんでしょうけどね。