私のmysqlテーブルにはエントリが含まれています
Foo Bar
(つまり、大文字と空白が含まれる可能性があります)
文字列「foobar」を使用してDBを検索し、これと一致させる必要があります
foobar は、最初に以下を使用して DB から生成されます。
$i = str_replace(' ','',$i);
$i = preg_replace("/[^A-Za-z0-9]/", "", $i);
$i = strtolower($i);
比較を実行する前にMySQLで変換するFoo Bar
のは簡単ではありません( UDFでは可能ですが)。次に、実行する必要があるのは次のとおりです。foobar
WHERE LOWER(preg_replace('/[^A-Za-z0-9]/', '', field)) = 'foobar'
最も簡単なオプションは、正規表現のパターンマッチングを使用することです。これは、デフォルトでは大文字と小文字を区別しません。(PHP内の)[^[:alnum:]]*
すべての文字の間に挿入foobar
して、データベースを検索するだけです。
WHERE field RLIKE '^[^[:alnum:]]*f[^[:alnum:]]*o[^[:alnum:]]*o[^[:alnum:]]*b[^[:alnum:]]*a[^[:alnum:]]*r[^[:alnum:]]*$'
最もエレガントな(多少難しいですが)解決策は、英数字以外の文字と大文字小文字を無視する独自の照合を定義し、それを使用することだと思います。
スペースだけが問題で、照合順序で大文字と小文字が区別されない場合:
WHERE REPLACE(tn.fieldname,' ','') LIKE 'foobar';
照合で大文字と小文字が区別される場合:
WHERE LOWER(REPLACE(tn.fieldname,' ','')) LIKE LOWER('foobar');
ただし、テーブル全体のスキャンが行われるため、優れたパフォーマンスではありません。fieldname
検索対象に正規化するか、正規化された別の列に正規化fieldname
すると、特にインデックスがある場合にパフォーマンスが向上します。