my mysql 表包含一个条目
Foo Bar
(即可能包括大写字母和空格)
我需要使用字符串"foobar"搜索数据库并匹配此
foobar 最初是从数据库生成的,使用:
$i = str_replace(' ','',$i);
$i = preg_replace("/[^A-Za-z0-9]/", "", $i);
$i = strtolower($i);
在执行比较之前,在MySQL中将Foo Bar
转换为foobar
并不容易(尽管可以使用UDF)。 然后你只需要做:
WHERE LOWER(preg_replace('/[^A-Za-z0-9]/', '', field)) = 'foobar'
最简单的选择是使用正则表达式模式匹配,默认情况下不区分大小写 - 只需在foobar
中的每个字符之间插入[^[:alnum:]]*
(在 PHP 中),然后搜索数据库:
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
的另一列会表现更好,尤其是带有索引的情况下。
MySQL没有任何等同于gawk的gensub()
或PHP的preg_replace()
。 虽然您可以使用MySQL的REPLACE()
和LOWER()
函数来删除特定字符,但您不能告诉MySQL删除/[^[:alnum:]]/
。
我的建议是使用 UDF。