SQLite3とsjisとlike検索の大文字小文字無視検索SQLite3とsjisとlike検索の大文字小文字無視検索

<< | コメント(0) | トラックバック(0) このエントリーを含むはてなブックマーク >>

sqliteで"モモタロウ"が'%テ%'のlike検索でひっかかるなどして、意味分からなかったので調べてみた。

カラム側の値をコツコツ変えてたら、どうやらウ単体がテでヒットするみたい。
ウとテの関連性を調べる旅が始まった、、、


まぁうだうだ書いても意味がないので結論から書くと。

テの文字コード:8365
ウの文字コード:8345
65を半角文字コードとして認識した場合の文字:E
45を半角文字コードとして認識した場合の文字:e
(全部sjisの話しです)

大文字と小文字の違いになります。
どうやらSQLite3のライブラリはsjisをマルチバイト文字として認識してくれないので、like検索をすると大文字-小文字無視検索が適用されてしまうらしい。

ってか前にMySQLでも似たような問題にぶつかって、その時は緊急性がなかったか何かで放置した気がする。
sjisでマルチバイト文字として認識して特殊な処理をしてくれてない限り、大文字小文字変換が適用される各環境で共通の問題なのかも。

解決策としてはおとなしくutf8使うか、ケースセンシティブlikeを有効にするかとか。

SQLiteだと「PRAGMA case_sensitive_like = 1」を実行したらヒットしなくなるみたい。
コンパイル時にパラメータ指定するとかいう方法もあるけど、自分が使ってる環境ではそんな段階から弄れる場所じゃなかったので、これで何とかしてみよう。

※追記
「PRAGMA case_sensitive_like = 1」を使用する場合も、コンパイル時に許可されてないと使えないみたい。
その辺どうしようもない環境とかの場合はGLOB演算使うとかかな。
GLOB演算は常にcase-sensitiveらしいので、問題なさそうだけど、今俺が使ってる環境ではそーゆー事できない。

うーんどうしよう。

※追記
色々投げだして、sqliteだけutf8にして都度変換するようにした。
パフォーマンスが、、、

トラックバック(0)

トラックバックURL: http://exe.tyo.ro/mt/mt-tb.cgi/556

コメントする

2014年10月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

月別 アーカイブ

2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年