【发布时间】:2012-10-20 18:55:19
【问题描述】:
我想知道是否有更好的方法:
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE('p%a_t*er?', '\\', '\\\\'), '%', '\%'), '_', '\_'), '*', '%'), '?', '_')
在 MySQL 中将标准搜索模式 * 和 ? 转换为 LIKE 等效项 % 和 _ ?
【问题讨论】:
我想知道是否有更好的方法:
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE('p%a_t*er?', '\\', '\\\\'), '%', '\%'), '_', '\_'), '*', '%'), '?', '_')
在 MySQL 中将标准搜索模式 * 和 ? 转换为 LIKE 等效项 % 和 _ ?
【问题讨论】:
您可以像这样使用 Mysql 的 regexp 而不是 like:
select * from my_table where col_name regexp 'p%a_t*er?';
使用正则表达式时,无需进行所有这些替换以使您的字符串 like 友好。
【讨论】:
$、^、[、]、(、) 等),我仍然需要来抑制它们。而且我不能要求我的客户学习正则表达式:-)
.* 不是处理 * 简化的正确正则表达式模式吗?
没有更短的方法可以直接在 MySQL 中执行多字符替换。有诸如用户定义函数 (UDF) 之类的替代方法,但我怀疑任何方法都对您的确切目的有益。
如果可以接受,我的建议是在查询数据库之前执行文本替换。
在 PHP 中,可以这样做:
$searchQuery = $_GET['q'];
$searchQuery = str_replace(array('*', '?'), array('%', '_'), $searchQuery);
// perform your query as normal
在 ASP 中,您可以尝试:
string searchQuery = Request.QueryString["q"];
searchQuery = searchQuery.Replace("*", "%").Replace("?", "_");
// perform your query as normal
虽然,这两种方法都不是超短的,但它们确实使它更易于阅读,并且不会为您的数据库查询增加任何时间。此外,在查询之前进行替换将允许您在清理字符串之前进行替换,因此您不需要像在现有查询中那样替换 \ - 这样可以节省一次替换!
【讨论】: