noise

計算機科学や各種設定のメモ

RubyでSQLite3を用いる場合の注意点

問題

  • WHERE節で文字列比較により特定レコードを取得しようとしたができなかった。
  • =ではなくLIKEを用いて一時的に対処した。

原因

  • RubyではバイナリデータはAsciiのStringとして扱われる。
  • SQLite3に於いてはカラムの型を指定してもINSERT時に動的に型が決定される。
  • したがってRubyGems内のSQLite3ライブラリを利用時にTEXT型を期待したにもかかわらずBLOB型でデータ挿入されることがある。
  • BLOB型ではwhere節の=での同値性指定が機能しない。

解決法

db.query "INSERT INTO member(name) VALUES(?)", "あいう".encode('UTF-8')

このようにencodeメソッドUTF-8を指定すれば問題は解決する。RubyがStringでバイト列と文字列の両方を扱うことに起因する問題だった。