2

我的 mysql 表包含一个条目

Foo Bar 

(即可能包括大写字母和空格)

我需要使用字符串 'foobar' 搜索数据库并匹配它

foob​​ar 最初是使用以下数据库从数据库生成的:

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

3 回答 3

2

Foo Bar在执行比较之前foobar在 MySQL 中进行转换并不容易(尽管可以使用 UDFs)。然后你只需要这样做:

WHERE LOWER(preg_replace('/[^A-Za-z0-9]/', '', field)) = 'foobar'

最简单的选择是使用正则表达式模式匹配,默认情况下不区分大小写——只需[^[:alnum:]]*在(PHP 中)的每个字符之间插入foobar,然后搜索数据库:

WHERE field RLIKE '^[^[:alnum:]]*f[^[:alnum:]]*o[^[:alnum:]]*o[^[:alnum:]]*b[^[:alnum:]]*a[^[:alnum:]]*r[^[:alnum:]]*$'

我认为最优雅(虽然有点困难)的解决方案是定义自己的排序规则,忽略非字母数字字符和字母大小写,然后使用它。

于 2012-06-27T13:08:43.607 回答
1

MySQL 没有任何等同于 gawkgensub()或 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 回答