2015-05-14 RubyでSQLite3を用いる場合の注意点 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でバイト列と文字列の両方を扱うことに起因する問題だった。 参考文献 SQLite使うときはRubyのStringの文字コード気をつけよう