2

私のmysqlテーブルにはエントリが含まれています

Foo Bar 

(つまり、大文字と空白が含まれる可能性があります)

文字列「foobar」を使用してDBを検索し、これと一致させる必要があります

foob​​ar は、最初に以下を使用して DB から生成されます。

$i = str_replace(' ','',$i);
$i = preg_replace("/[^A-Za-z0-9]/", "", $i);
$i = strtolower($i);
4

3 に答える 3

2

比較を実行する前に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:]]*$'

最もエレガントな(多少難しいですが)解決策は、英数字以外の文字と大文字小文字を無視する独自の照合を定義し、それを使用することだと思います。

于 2012-06-27T13:08:43.607 に答える
1

gensub()MySQL には、gawkや PHPに相当するものはありませんpreg_replace()。MySQL のREPLACE()およびLOWER()関数を使用して特定の文字を削除することはできますが、MySQL に削除するように指示することはできません/[^[:alnum:]]/

私の提案は、UDFを使用することです。

于 2012-06-27T13:21:12.987 に答える
1

スペースだけが問題で、照合順序で大文字と小文字が区別されない場合:

WHERE REPLACE(tn.fieldname,' ','') LIKE 'foobar';

照合で大文字と小文字が区別される場合:

WHERE LOWER(REPLACE(tn.fieldname,' ','')) LIKE LOWER('foobar');

ただし、テーブル全体のスキャンが行われるため、優れたパフォーマンスではありません。fieldname検索対象に正規化するか、正規化された別の列に正規化fieldnameすると、特にインデックスがある場合にパフォーマンスが向上します。

于 2012-06-27T13:27:39.137 に答える