Nacky - Snowland.net

Nacky(Issei Ishii)がDJ/Composerのようなふりして書き散らすblogサイト

Info

Nacky - Snowland.net - blogを移転しました

2010-05-18

SQLで大文字/小文字/全角/半角/ひらがな/カタカナを検索

文字列一致を見たいのだが,文字列には全角/半角,大文字/小文字,ひらがな/カタカナが含まれている.
これを一括で条件指定したい.
というときの解決法.
(PHP+ PostgreSQL/MySQLを想定)

■1.検索用に別カラムを持っておく
DBにあらかじめ mb_convert_encoding($str,'AcKV') 等で簡易に正規化(?)した文字列を持つためのカラムを作成する.
検索時は変換したカラムに対して指定する.

まぁ,これが楽か.
ただしINSERTもUPDATEも二度手間です.
そういうものだとして実装すれば良いわけですが.

■2.検索時にがんばる
2-1.translateする
translate(upper(str_column),'abc...','abc...') LIKE '%str%'
ただしPostgreSQLにはtranslateがありますがMySQLには無いようです.
アルファベット26文字+ひらがな50音+α…面倒…

2-2.正規表現でがんばる
あらかじめPHPで '(s|S|s|S)(t|T|t|T)(r|R|r|R)' みたいな文字列を作っておいて
str_column ~ '(s|S|s|S)(t|T|t|T)(r|R|r|R)'
とする(MySQLの場合は ~ じゃなくて REGEXP).

いずれにしろコスト高いなー.

■ということで
あらかじめわかっているなら1.のほうが良いですね.
あとはテキスト全文検索で正規化機能を使うとか(というかこれが本命?).ただし標準で入ってないことも多いのでケースバイケース.

posted at 19:45:51 on 2010-05-18 by nacky - Category: Com/Tech ( PHP , Database )

ソニーストア

TrackBack

このエントリにトラックバックはありません
トラックバックURL

Comments

No comments yet

Add Comments