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にして都度変換するようにした。
パフォーマンスが、、、
コメントする